我正在寻找可以在我的 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
无法访问该对象。如果我错了,请纠正我的理解。