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 Page执行顺序(ASP.NET生命周期)

ASP.NET MVC 生命周期 - 每个页面请求做一些工作

asp.net mvc 生命周期

asp.net MVC 应用程序的生命周期

[译] ASP.NET 生命周期 – ASP.NET 上下文对象

ASP.NET 生命周期,PreRequestHandlerExecute 事件