我正在尝试在每个请求结束时执行一些操作。 我更改了创建新项目时生成的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。这也可能是我的事件(如开头所述)未被调用的原因。
答案 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也更清晰。