2009-07-14 31 views
9

Tôi đã nghe những điều tốt đẹp về Softsys Hosting và vì vậy tôi đã quyết định chuyển giải pháp ASP.NET MVC của mình sang chúng. Nhưng nó sẽ không chạy trên chúng. Tôi đã có thể xác định vấn đề cho trình xử lý sự kiện BeginRequest của mình. Nếu tôi có chúng tôi sẽ gặp lỗi. Đây là mã của tôi.Tại sao máy chủ của tôi không thể (softsyshosting.com) hỗ trợ trình xử lý sự kiện BeginRequest và EndRequest?

protected void Application_Start() 
{ 
    RegisterRoutes(RouteTable.Routes); 
    this.BeginRequest += new EventHandler(MvcApplication_BeginRequest); 
    this.EndRequest += new EventHandler(MvcApplication_EndRequest); 
} 

void MvcApplication_EndRequest(object sender, EventArgs e) 
{ 
} 

void MvcApplication_BeginRequest(object sender, EventArgs e) 
{ 
} 

Tôi có thể tạo lại sự cố bằng cách chỉ tạo ứng dụng ASP.NET MVC mặc định và thêm mã ở trên. Điều kỳ lạ là mã này hoạt động tốt trên máy chủ cũ của tôi và nó chỉ bị treo trên máy chủ lưu trữ mới (được chia sẻ) của tôi. Nếu tôi có những xử lý sự kiện trong mã của tôi, tôi nhận được lỗi này:

Server Error in '/' Application.   Object reference not set to an instance of an object. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error: An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[NullReferenceException: Object reference not set to an instance of an object.] System.Web.PipelineModuleStepContainer.GetStepArray(RequestNotification notification, Boolean isPostEvent) +27 System.Web.PipelineModuleStepContainer.GetEventCount(RequestNotification notification, Boolean isPostEvent) +11 System.Web.PipelineStepManager.ResumeSteps(Exception error) +205 System.Web.HttpApplication.BeginProcessRequestNotification(HttpContext context, AsyncCallback cb) +91 System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +514

Tôi đã cố gắng khắc phục sự cố này với Softsys, nhưng họ không phải là rất hữu ích, về cơ bản họ chỉ xác nhận rằng tôi đã bật "ASP.NET Pipeline (MVC) "chức năng trong bảng điều khiển quản trị của tôi.

Có thể ai đó:

  1. Hãy nói cho tôi nếu tôi đã mã hóa một cái gì đó sai
  2. Chỉ cho tôi một công việc xung quanh
  3. Hãy giải thích cho tôi tại sao lỗi này xảy ra trên một máy chủ và không phải là khác.
+0

Sẽ không rằng thà làm một câu hỏi cho sự ủng hộ của hoster của bạn? –

+0

Bạn có đang sử dụng NHibernate không? –

+0

Oliver, vâng tôi đã cố gắng nhận được sự hỗ trợ từ Softsys Hosting, nhưng chúng không hữu ích lắm. Họ muốn tính phí cho tôi 95 đô la/nhân sự để khắc phục sự cố này. Tôi đã hài lòng với mọi thứ khác về họ và không muốn từ bỏ chúng nếu đó là điều tôi đang làm sai. Dreas, không, tôi không sử dụng NHibernate. – Whozumommy

Trả lời

7

Có vẻ như tôi đã chuyển từ chế độ IIS 6 hoặc IIS 7 Classic sang chế độ Tích hợp IIS 7. Trong chế độ tích hợp IIS 7, xử lý Yêu cầu đã được tách rời khỏi ứng dụng bắt đầu. This article giải thích lý do tại sao và ở đâu.

Để khắc phục, bạn cần phải di chuyển mã của mình sang Application_BeginRequest thay thế.

16

Bạn cần đăng ký trình xử lý của mình trong mỗi cá thể HttpApplication. Có thể có một số trường hợp gộp của HttpApplication. Application_Start được gọi chỉ một lần (cho IIS 6 và IIS 7 ở chế độ cổ điển - theo yêu cầu đầu tiên, cho chế độ tích hợp IIS 7 - trên ứng dụng web bắt đầu, ngay trước khi có yêu cầu). Vì vậy, để có được tất cả các công việc bạn cần phải thêm xử lý sự kiện trong phương pháp Init overrided của HttpApplication hoặc trong constructor của nó. Nếu bạn thêm chúng vào hàm tạo - các trình xử lý này sẽ được gọi trước, ngay cả trước các trình xử lý các mô-đun đã đăng ký.
Vì vậy, mã của bạn sẽ trông như thế này:

public class MySmartApp: HttpApplication{ 
    public override void Init(){ 
     this.BeginRequest += new EventHandler(MvcApplication_BeginRequest); 
     this.EndRequest += new EventHandler(MvcApplication_EndRequest); 
    } 
    protected void Application_Start(){ 
     RegisterRoutes(RouteTable.Routes); 
    } 
} 

hay như thế này:

public class MySmartApp: HttpApplication{ 
    public MySmartApp(){ 
     this.BeginRequest += new EventHandler(MvcApplication_BeginRequest); 
     this.EndRequest += new EventHandler(MvcApplication_EndRequest); 
    } 
    protected void Application_Start(){ 
     RegisterRoutes(RouteTable.Routes); 
    } 
} 
+0

Đây là thông tin tuyệt vời, mặc dù tôi nghi ngờ nó sẽ không giải quyết được vấn đề này. Tôi có thể repro vấn đề này (tốt, nó chỉ repro's sporadically cho tôi) mà không cần đăng ký xử lý trong Application_OnStart. Nó sẽ hữu ích để tìm ra những gì lỗi này thực sự có nghĩa là (những gì nó là đó là null). –

+0

Bạn có thể cung cấp một số liên kết liên quan đến thông tin trên không? Có lẽ một bài viết MSDN? –

+0

Câu trả lời hay. Giải quyết vấn đề cho tôi. Đây là trên .NET 4.5, MVC 4, IIS 8. –

Các vấn đề liên quan