2011-06-27 82 views
4

我正在開發一個ASP.NET 3.5 WebForms應用程序,我希望會話在一段時間後超時。之後,如果用戶試圖做任何事情,應用程序應該將它們重定向到一個頁面,指出會話已超時,並且需要重新開始。據我所知,非常標準的東西。會話不在ASP.NET Web應用程序超時

但是,我似乎無法使會話超時測試此功能,無論是從Visual Studio或從IIS運行。這裏是我的會話狀態設置在web.config中:

<sessionState mode="SQLServer" 
       allowCustomSqlDatabase="true" 
       sqlConnectionString="<ConnectionString>" 
       cookieless="false" 
       timeout="1" /> 

以下是我正在測試用於會話超時:

public bool IsSessionTimeout 
{ 
    get 
    { 
     // If the session says its a new session, but a cookie exists, then the session has timed out. 
     if (Context.Session != null && Session.IsNewSession) 
     { 
      string cookie = Request.Headers["Cookie"]; 
      return !string.IsNullOrEmpty(cookie) && cookie.IndexOf("ASP.NET_SessionId") >= 0; 
     } 
     else 
     { 
      return false; 
     } 
    } 
} 

看來,Session.IsNewSession總是返回false,這是有道理的,因爲Session_End中的方法永遠不會在我的Global.asax.cs中被調用。我錯過了什麼?

+3

我相信Session_End中只在會話過程要求。檢查會話ID以查看是否在時間到期後生成新的ID。 –

回答

1

這是我最終實現的。

在Global.asax.cs中:

protected void Session_Start(object sender, EventArgs e) 
{ 
    Session[SessionKeys.SessionStart] = DateTime.Now; 
} 

在我的網頁的基類:

public bool IsSessionTimeout 
{ 
    get 
    { 
     DateTime? sessionStart = Session[SessionKeys.SessionStart] as DateTime?; 
     bool isTimeout = false; 

     if (!sessionStart.HasValue) 
     { 
      // If sessionStart doesn't have a value, the session has been cleared, 
      // so assume a timeout has occurred.    
      isTimeout = true; 
     } 
     else 
     { 
      // Otherwise, check the elapsed time. 
      TimeSpan elapsed = DateTime.Now - sessionStart.Value; 
      isTimeout = elapsed.TotalMinutes > Session.Timeout; 
     } 

     Session[SessionKeys.SessionStart] = DateTime.Now; 
     return isTimeout; 
    } 
} 
2

我這樣做:

 if (Session["myUser"] != null) 
      myUser = (User)Session["myUser"]; 
     else 
      myUser = null; 

     //User must be logged in, if not redirect to the login page - unless we are already running the login page. 
     if ((myUser == null) && (Request.Url.AbsolutePath != "/Login.aspx")) 
      Response.Redirect("Login.aspx?Mode=Timeout", true); 

在我的母版頁的page_init爲我的網站之一。你可以很容易地適應你想要的東西。基本上,檢查會話中應該存在的內容,如果不存在,則會話超時並且可以採取適當的操作。

在我的情況下,他們被重定向到登錄頁面。就你而言,只要他們開始你的'流程',你就設置一個會話變量。在每個頁面請求上,查看該項目是否仍然存在於會話中。

+0

當我看到您的答案時,我認爲它會解決我的問題,但由於某種原因,我的會話對象在超時時間結束後仍然存在。我認爲SQL Server可能沒有正確設置,但不幸的是,我沒有太多的控制權。我最終實現的結果是將您的答案與手動檢查時間結合起來。 – FishBasketGordo