2013-02-01 33 views
1

在我的web應用程序中,我經常可以看到,當我幾分鐘內沒有做任何事情,然後我回來,刷新頁面 - 我我仍然在登錄,但我的會話數據都沒有了!ASP.NET MVC - 閒置數分鐘後刪除會話數據

login()行動中,我設置了幾個Session[]對象,這些對象是頁面正常工作所必需的。我不知道爲什麼它會這樣做,但我需要它在用戶清除會話數據時登錄用戶。

我已閱讀有關設置<sessionState mode="InProc" timeout="20"/>,但每次刷新頁面時都會刷新此超時值嗎?或者在我登錄後的20分鐘後它會耗盡?如果我讓這個計時器比保持用戶在線更大,該怎麼辦?

回答

3

重新回到服務器會使會話保持更長時間。這是一個滑動到期。有兩種方法從客戶端,客戶端不知道這20分鐘超時的處理:

  • 用時20分鐘打一個重定向到註銷頁面客戶端的JavaScript創建一個定時器
  • 每當回發會發生,請檢查會話是否過期(可以通過多種方式完成,例如檢查Session.IsNewSession,查看對象是否丟失等),然後在處理請求之前重定向到註銷處理程序。
0

嘗試檢查這一點:

問:在PROC模式,爲什麼我失去了我所有偶爾會?

答:請參閱本文的「瞭解會話 狀態模式」部分中的「健壯性」部分。

健壯性

是InProc - 會話狀態將被丟失,如果工作進程 (ASPNET_WP.EXE)回收,或者如果應用程序域重新啓動。這是因爲 會話狀態存儲在appdomain的內存空間中。 重新啓動可能是由某些配置文件如 修改爲web.config和machine.config或\ bin目錄 (例如在使用VS重新編譯應用程序之後的新DLL)中的任何更改導致的對於 詳情請參閱KB324772。在v1中,還有一個錯誤會導致 工作進程重新啓動。它在SP2和v1.1中得到了修復。請參閱 KB321792。

來源 - http://forums.asp.net/t/7504.aspx/1

1

我假設你正在使用窗體身份驗證。那是對的嗎?如果是這樣,您需要讓您的表單身份驗證票證的超時匹配會話超時。

用戶通過一個比看起來更復雜的過程保持登錄狀態。 Cookie存儲在用戶的瀏覽器中,該瀏覽器稱爲Forms Authentication Ticket。如果用戶保持空閒超過會話超時限制,服務器將放棄會話。但是在下一個請求中,表單身份驗證票證會被傳回到Web服務器。服務器驗證票證,如果它仍然有效,則用戶重新登錄。

正如你所看到的,用戶的會話不會被恢復。如果你想要這種行爲,你必須檢測出這種情況並自己恢復會話。

解決方法是將Forms Authentication Ticket的超時設置爲與Session超時相同。您完成在Web.config文件,as explained here

<system.web> 
    <authentication mode="Forms"> 
      <forms timeout="20"/> 
    </authentication> 
</system.web> 

的超時值以分鐘爲單位。一旦表單身份驗證票證的超時被擊中,用戶將被註銷。這個操作獨立於會話的超時,但如果它們是相同的,它們將在大致相同的時間到期。如果您想要完全安全,請將Forms Authentication Ticket超時設置爲比會話超時短一點。用戶在會話超時之前將被註銷。當他們再次登錄時,他們將獲得新的會話。舊會議最終會自行超時。