2010-04-13 136 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,直到沒有會話存儲。