2009-04-18 28 views
13

Tôi đang cố gắng thực hiện một số hành động vào cuối mỗi yêu cầu. Tôi đã thay đổi Application_Start() được tạo ra khi tạo dự án mới để thực hiện một thử nghiệm:ASP.NET MVC không gọi global.asax 'EndRequest

protected void Application_Start() 
{ 
    EndRequest += (s, e) => 
    { 
     Console.Write("fghfgh"); 
    }; 
    RegisterRoutes(RouteTable.Routes); 
} 

Lambda sẽ không được gọi. Bất kỳ ý tưởng tại sao?

chỉnh sửa: Tôi thấy rằng họ đang làm điều tương tự trong SharpArch [http://code.google.com/p/sharp-architecture/] và nó hoạt động ở đó ... Và không, tôi không muốn sử dụng HttpModule.

edit2: Cách giải quyết duy nhất tôi thấy là sử dụng Application_EndRequest trong conjuction với một thành viên tĩnh riêng tư của global.asax:

private static WebSessionStorage wss; 
protected void Application_Start() 
{ 
    //... 
    wss = new WebSessionStorage(this); 
    //... 
} 

protected void Application_EndRequest(object sender, EventArgs e) 
{ 
    wss.EndRequest(sender, e); 
} 

WSS phải tin bởi vì nó có vẻ như Application_EndRequest đang được gọi là sử dụng khác nhau đối tượng thể hiện (điều này). Đó cũng có thể là lý do cho sự kiện của tôi (như được mô tả ở đầu) không được gọi.

+0

u shoudl chấp nhận câu trả lời cho số – Simon

+0

Bạn có thể đọc thêm về lý do tại sao nó hoạt động như thế này tại đây: http://devhawk.net/2009/08/06/I+Hate+Globalasax.aspx –

Trả lời

16

tôi thường làm:

protected void Application_EndRequest(object sender, EventArgs e) 
{ 
} 

này hoạt động như mong đợi. Không biết về sự kiện này.

+0

Tôi thực sự vượt qua điều này ví dụ cho một số đối tượng, mà lần lượt móc với xử lý riêng của nó. Vì vậy, tôi không thể sử dụng Application_EndRequest. – user87338

+0

Bạn đang làm gì? –

+0

trong Application_Start Tôi đang làm: NHSession.Init (new WebSessionStorage (this)); WebSessionManager móc trong ctor của nó: public WebSessionStorage (HttpApplication app) { app.EndRequest + = Application_EndRequest; } – user87338

5

Đặt cược tốt nhất của bạn là thực hiện việc này trong một HttpModule. Tôi sử dụng một HttpModule để quản lý phiên NHibernate trong một ứng dụng MVC và nó hoạt động hoàn hảo. Trong yêu cầu bắt đầu, tôi ràng buộc sessionFactory đến ManagedWebSessionContext (trong NHibernate nhưng khá không có giấy tờ) và sau đó trong yêu cầu kết thúc, tôi cam kết bất kỳ giao dịch nào và hủy liên kết sessionFactory.

Tôi nghĩ rằng nó là sạch hơn để tách này thành một HttpModule là tốt.

16

Ví dụ HttpApplication được đại diện bởi tệp global.asax của bạn là một cá thể duy nhất chỉ đại diện cho đối tượng HttpApplication đầu tiên. Nó không được đảm bảo rằng trường hợp này của HttpApplication sẽ được sử dụng cho bất kỳ yêu cầu nào khác.

Bạn cần phải ghi đè phương thức Init() trong global.asax và trong rằng phương pháp treo lên bất kỳ sự kiện mà bạn muốn:

public override void Init() { 
    base.Init(); 

    EndRequest += MyEventHandler; 
} 

Vui lòng tham khảo this MSDN article để biết thêm về đối tượng HttpApplication.

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