2010-04-13 137 views
0

我想在我的asp.net应用程序中检测会话状态超时,但无法这样做。我有一个基类从System.Web.UI.Page派生如下: -ASP.NET会话状态超时问题

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中实现了一个状态服务器。这不是一个进程内会话状态实现。

在此先感谢。

回答

0

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

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

我不知道为什么超时不会被解雇。你有没有把代码放在Global.asax Session_End事件中来验证会话没有结束?

+0

所以你说在第一次请求之后IsNewSession会一直是假的?所以,即使会话超时,上面的代码也不会工作,因为IsNewSession将始终是false,并且代码永远不会有机会进入并执行“S​​ession.Abandon”,而实际上会话超时? – user314827 2010-04-13 22:56:19

+0

IsNewSession只对导致创建新会话对象的HttpRequest成立。在超时后第一次请求服务器应该这样做,我相信。 – womp 2010-04-13 23:48:30

+0

另外我在SQL Server 2008中实现了一个状态服务器。这不是一个进程内会话状态实现。 – user314827 2010-04-14 00:24:30

2

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

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

让我知道这个解决方案是否适合你。

0

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

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

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