ASP.NET 请求响应周期:寻找随每个请求触发并具有可用 SessionState 的事件
Posted
技术标签:
【中文标题】ASP.NET 请求响应周期:寻找随每个请求触发并具有可用 SessionState 的事件【英文标题】:ASP.NET Request Response Cycle: Looking for an event that triggers with every request and has SessionState available 【发布时间】:2013-05-24 14:31:32 【问题描述】:我正在寻找一个我可以在我的 MVC 应用程序的 Global.asax 中处理的事件:
1) 在应用程序处理请求之前,每个请求都会触发该事件。
和
2) 事件在Session
对象 (HttpSessionState
) 可用时触发。
我要做什么
我正在处理会话超时问题。所以,我有一个Session_Start
的处理程序,看起来像这样:
protected void Session_Start(object sender, EventArgs args)
string requestCookies = Request.Headers["Cookie"];
if ((null != requestCookies) &&
(requestCookies.IndexOf("ASP.NET_SessionId") >= 0))
var requestBase = new HttpRequestWrapper(Request);
if (requestBase.IsAjaxRequest())
Response.Write("Your session has expired. You need to login again.<br />");
Response.End();
else
Response.Redirect("~/?expired");
有些恶意页面包含 IFRAME,它们会加载部分视图。如果用户在会话过期时触发加载此类 IFRAME 的请求,这将是一个 Ajax 请求,因此,在这种情况下,我直接在此类请求的响应缓冲区中写入并刷新响应缓冲区。
但是,如果用户意外或故意(某些流氓用户)忽略会话超时消息并尝试重新加载 IFRAME,则这次甚至不会调用 Session_Start,因为将创建一个新会话他最后一次收到会话超时警告,因此,他将有一个有效的会话。这可能是一个危险的情况。我想避免它。
因此,我想为每个请求触发的事件编写一个处理程序,并在HttpSessionState
准备好时触发。
Begin_Request
不会这样做,因为那时HttpSessionState
对象不可访问,我推断。如果我错了,请纠正我的理解。
【问题讨论】:
【参考方案1】:尝试处理 AcquireRequestState 事件:
protected void Application_AcquireRequestState(object sender, EventArgs args)
...
【讨论】:
雅皮士!非常感谢你。 :-)以上是关于ASP.NET 请求响应周期:寻找随每个请求触发并具有可用 SessionState 的事件的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET MVC 生命周期 - 每个页面请求做一些工作