2009-04-18 69 views
13

我試圖在每個請求結束時執行一些操作。 我改變了的Application_Start()這是當創建新的項目進行測試產生:ASP.NET MVC不會調用global.asax'EndRequest

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

拉姆達將不會被調用。任何想法爲什麼?

編輯: 我看到他們在SharpArch [http://code.google.com/p/sharp-architecture/]做類似的事情,它並在那裏工作...... 不,我不想用一個HttpModule。

EDIT2: 我發現的唯一的解決辦法是,聯合使用以使用Application_EndRequest與Global.asax中的私有靜態成員:因爲它似乎像Application_EndRequest採用不同的是被稱爲

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必須是私有實例對象(this)。這也可能是我的事件(如開頭所述)未被調用的原因。

+0

u shoudl接受這個問題的答案 – Simon 2010-01-08 02:13:03

+0

你可以在這裏閱讀更多關於爲什麼它的行爲如下:http://devhawk.net/2009/08/06/I+Hate+Globalasax.aspx – 2011-01-30 23:12:00

回答

16

我通常做的:

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

可正常工作。雖然不知道事件。

5

最好的辦法是在HttpModule中做到這一點。我使用HttpModule來管理MVC應用程序中的NHibernate會話,並且它完美地工作。在開始請求中,我將sessionFactory綁定到ManagedWebSessionContext(在NHibernate中,但沒有記錄),然後在最後的請求中提交任何事務並解除綁定sessionFactory。

我認爲把它分成HttpModule也是比較乾淨的。

16

由global.asax文件表示的HttpApplication實例是僅代表第一個 HttpApplication對象的單個實例。不保證HttpApplication的這個實例將被用於任何其他請求。

你需要重寫init()方法中的Global.asax和方法掛鉤,你想要的任何事件:

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

    EndRequest += MyEventHandler; 
} 

請參考this MSDN article爲HttpApplication對象的更多信息。