ASP.NET MVC不会调用global.asax的EndRequest

use*_*338 14 asp.net-mvc global-asax

我试图在每个请求结束时执行一些操作.我更改了创建新项目时生成的Application_Start()以进行测试:

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

lambda不会被调用.有什么想法吗?

编辑:我看到他们在SharpArch中做了类似的事情[ http://code.google.com/p/sharp-architecture/]并且它确实在那里工作......不,我不想使用HttpModule .

edit2:我发现的唯一解决方法是将Application_EndRequest与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);
}
Run Code Online (Sandbox Code Playgroud)

wss必须是私有的,因为看起来像是使用不同的实例对象(this)调用Application_EndRequest.这也可能是我的事件(如开头所述)未被调用的原因.

Jab*_*abe 18

我经常这样做:

protected void Application_EndRequest(object sender, EventArgs e)
{
}
Run Code Online (Sandbox Code Playgroud)

这按预期工作.但是不知道这个事件.


Eil*_*lon 16

由global.asax文件表示的HttpApplication 实例是仅表示第一个 HttpApplication对象的单个实例.无法保证此HttpApplication实例将用于任何其他请求.

您需要覆盖global.asax中的Init()方法,并在方法中挂接您想要的任何事件:

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

    EndRequest += MyEventHandler;
}
Run Code Online (Sandbox Code Playgroud)

有关HttpApplication对象的更多信息,请参阅此MSDN文章.


Jam*_*ery 5

最好的办法是在HttpModule中执行此操作.我使用HttpModule来管理MVC应用程序中的NHibernate会话,它运行得很好.在begin请求中,我将sessionFactory绑定到ManagedWebSessionContext(在NHibernate中,但是相当未记录),然后在最终请求中我提交任何事务并取消绑定sessionFactory.

我认为将它分成HttpModule也更清晰.