ASP.NET会话状态超时问题

时间:2010-04-13 20:20:26

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

我正在尝试在我的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。这仅适用于第一个请求,然后始终为false。我将超时设置为1分钟。会议似乎永远不会超时。我在这里缺少什么?

此外,我在SQL Server 2008中实现了一个状态服务器。这不是进程内会话状态实现。

提前致谢。

3 个答案:

答案 0 :(得分:2)

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

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

如果此解决方案适合您,请告诉我。

答案 1 :(得分:0)

根据用户对服务器的第一次请求启动ASP.Net会话。这是IsNewSession唯一真实的时间。

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

我不确定为什么超时不会被解雇。您是否已将代码放入Global.asax Session_End事件中以验证会话是否未结束?

答案 2 :(得分:0)

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

一旦你在会话中存储了一些值,IsNewSession下次即使很多回发也会返回false。

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