16

我试图在每个请求结束时执行一些操作。我更改了创建新项目时生成的 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 必须是私有的,因为看起来 Application_EndRequest 是使用不同的实例对象(this)调用的。这也可能是我的事件(如开头所述)没有被调用的原因。

4

4 回答 4

18

我通常这样做:

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

这按预期工作。虽然不知道这个事件。

于 2009-04-18T22:00:50.323 回答
15

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

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

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

    EndRequest += MyEventHandler;
}

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

于 2010-01-02T22:05:03.090 回答
5

您最好的选择是在 HttpModule 中执行此操作。我使用 HttpModule 来管理 MVC 应用程序中的 NHibernate 会话,它运行良好。在开始请求中,我将 sessionFactory 绑定到 ManagedWebSessionContext(在 NHibernate 中但相当无证),然后在结束请求中我提交任何事务并取消绑定 sessionFactory。

我认为将它分成一个 HttpModule 也更干净。

于 2009-04-18T22:48:17.090 回答
0

对于 MVC.net,您需要添加。

protected void Application_EndRequest()
{
  Debug.WriteLine("End Request");
}
于 2021-12-29T18:49:45.873 回答