0

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

4

1 回答 1

3

尝试处理 AcquireRequestState 事件:

protected void Application_AcquireRequestState(object sender, EventArgs args)
{
    ...
}
于 2013-05-24T14:42:09.333 回答