2009-04-18 71 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对象的更多信息。