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

问题描述 投票:0回答:4

我试图在每个请求结束时执行一些操作。 我更改了创建新项目时生成的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。

编辑2: 我发现的唯一解决方法是将 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)调用的。这也可能是我的活动(如开头所述)未被调用的原因。

asp.net-mvc global-asax
4个回答
18
投票

我通常这样做:

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

这按预期工作。虽然不知道这个活动。


17
投票
global.asax 文件表示的 HttpApplication 实例是一个单独的实例,仅表示

first HttpApplication 对象。不保证 HttpApplication 的此实例将用于任何其他请求。

您需要重写 global.asax 中的 Init() 方法,并在

that 方法中连接您想要的任何事件:

public override void Init() { base.Init(); EndRequest += MyEventHandler; }

请参阅

这篇 MSDN 文章,了解有关 HttpApplication 对象的更多信息。


5
投票
最好的选择是在 HttpModule 中执行此操作。我使用 HttpModule 来管理 MVC 应用程序中的 NHibernate 会话,它工作得很好。在开始请求中,我将 sessionFactory 绑定到 ManagedWebSessionContext(在 NHibernate 中,但相当没有文档记录),然后在结束请求中,我提交任何事务并取消绑定 sessionFactory。

我认为将其分离到 HttpModule 中也更干净。


0
投票
对于ASP.NET MVC,需要添加。

protected void Application_EndRequest() { Debug.WriteLine("End Request"); }
    
© www.soinside.com 2019 - 2024. All rights reserved.