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文章.
最好的办法是在HttpModule中执行此操作.我使用HttpModule来管理MVC应用程序中的NHibernate会话,它运行得很好.在begin请求中,我将sessionFactory绑定到ManagedWebSessionContext(在NHibernate中,但是相当未记录),然后在最终请求中我提交任何事务并取消绑定sessionFactory.
我认为将它分成HttpModule也更清晰.
| 归档时间: |
|
| 查看次数: |
23505 次 |
| 最近记录: |