【问题标题】:ASP.NET Session State Timeout ProblemASP.NET 会话状态超时问题
【发布时间】:2011-02-07 15:25:56
【问题描述】:

我试图在我的 asp.net 应用程序中检测会话状态超时,但我无法这样做。我有一个派生自 System.Web.UI.Page 的基类,如下所示:-

public class BasePageSessionExpire : Page
{
    override protected void OnInit(EventArgs e)
    {
        base.OnInit(e); 
        if (Context.Session != null)
        {                
            if (Session.IsNewSession)
            {                    
                string szCookieHeader = Request.Headers["Cookie"];
                if ((null != szCookieHeader) && (szCookieHeader.IndexOf("ASP.NET_SessionId") > 0))
                {
                    Session.Abandon();
                    Response.Redirect("~/SessionExpired.aspx",true);
                }
            }
        }
    }
}

我需要检查会话状态的所有页面都派生自这个基类,而不是“System.Web.UI.Page”。此外,所有这些页面都具有 EnableSessionState="True"。如果相关的话,我的 global.asax 文件中有一个空白的 Session_Start() 方法。

出于某种原因,在第一次请求之后,“Session.IsNewSession”属性始终为 false。仅对第一个请求为真,然后始终为假。我将超时设置为 1 分钟。会话似乎永远不会超时。我在这里错过了什么?

我还在 SQL Server 2008 中实现了状态服务器。这不是进程内会话状态实现。

提前致谢。

【问题讨论】:

    标签: asp.net session session-state session-timeout


    【解决方案1】:

    在您的应用程序中,如果没有 Session_Start 事件,那么每次IsNewSession 都会为每个回发返回 true,除非您在会话中存储一些值。

    一旦你在会话中存储了一些值,IsNewSession 会在下次甚至很多回发时返回 false。

    一旦会话到期,IsNewSession 将返回 true,直到没有会话存储。

    【讨论】:

      【解决方案2】:

      由于您在 global.asax 文件中有 Session_start 事件,会话到期后,Session_start 再次触发。这意味着会话 ID 已经创建,因此 oninit 事件 IsNewSessionId 将返回 false,因为会话 ID 已经创建。

      因此删除 Session_Start 事件将起作用。

      让我知道此解决方案是否适合您。

      【讨论】:

        【解决方案3】:

        ASP.Net 会话在用户第一次请求服务器时启动。这是IsNewSession 唯一一次为真。

        调用 Session.Abandon() 删除当前会话,然后如果您将用户重定向到 SessionExpired 页面,这将启动一个新会话。

        我不确定为什么超时不会触发。您是否在 Global.asax Session_End 事件中添加了代码来验证会话没有结束?

        【讨论】:

        • 所以你是说 IsNewSession 在第一次请求后总是假的?所以基本上即使会话超时,上面的代码也不起作用,因为 IsNewSession 总是错误的,当会话实际上超时时,代码永远不会有机会进入并执行“S​​ession.Abandon”?
        • IsNewSession 仅对导致创建新会话对象的 HttpRequest 为真。我相信超时后对服务器的第一个请求应该这样做。
        • 我还在 SQL Server 2008 中实现了一个状态服务器。这不是进程内会话状态实现。
        猜你喜欢
        • 2011-10-11
        • 2022-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-21
        • 1970-01-01
        相关资源
        最近更新 更多