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

时间:2009-04-18 21:56:45

标签: asp.net-mvc global-asax

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

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

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);
}

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

3 个答案:

答案 0 :(得分:17)

我通常会这样做:

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

这可以按预期工作。但不知道这件事。

答案 1 :(得分:16)

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

您需要覆盖global.asax和中的Init()方法方法挂钩您想要的任何事件:

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

    EndRequest += MyEventHandler;
}

有关HttpApplication对象的更多信息,请参阅this MSDN article

答案 2 :(得分:5)

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

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