失去會話狀態
我有一個 ASP.net 應用程序,其中使用者無法成功完成某些操作,原因,我假設,只能與失去他們的會話有關(這是我維護他們目前使用者資訊的地方,以及如何確定是否他們已登錄)
我不知道他們為什麼會失去他們的會議,所以我的第一個問題是:
什麼(通常)會導致使用者在 ASP.net 中失去會話?
並且因為我不知道使用者何時失去他們的會話並且自己無法重現它:
我如何跟踪我的使用者何時失去他們的會話
下面是我的 sessionState 配置供參考
<sessionState mode="InProc" cookieless="false" cookieName="My.Site.Com" timeout="480"/>
許多事情會導致會話狀態神秘地消失。
- 您的 sessionState 超時已過期
- 您更新您的 web.config 或其他導致 AppDomain 回收的文件類型
- IIS 中的 AppPool 回收
- 您使用大量文件更新您的站點,並且 ASP.NET 主動破壞您的 AppDomain 以重新編譯和保留記憶體。
如果您使用的是 IIS 7 或 7.5,請注意以下幾點:
- 預設情況下,IIS 將 AppPools 設置為在一段時間不活動後自行關閉。
- 預設情況下,IIS 將 AppPools 設置為每 1740 分鐘回收一次(顯然取決於您的根配置,但這是預設設置)
- 在 IIS 中,檢查 AppPool 的“高級設置”。其中有一個名為“空閒超時”的屬性。將其設置為零或高於預設值 (20)。
- 在 IIS 中,檢查 AppPool 的“回收”設置。您可以在此處啟用或禁用您的 AppPool 進行回收。嚮導的第 2 頁是一種將每種 AppPool 關閉類型記錄到事件日誌的方法。
如果您使用的是 IIS 6,則應用相同的設置(大多數情況下使用不同的獲取方式),但是讓它們記錄回收更麻煩。以下是讓 IIS 6 記錄 AppPool 回收事件的方法的連結:
<http://web.archive.org/web/20100803114054/http://surrealization.com/sample-code/getnotifiedwhenapppoolrecycles/>
如果您正在更新 Web 應用程序上的文件,您應該預計所有會話都會失去。這就是野獸的本性。但是,您可能不會期望它會發生多次。如果您更新了 15 個或更多文件(aspx、dll 等),您可能會在一段時間內多次重新啟動,因為訪問該站點的使用者會重新編譯這些頁面。看這兩個連結:
<http://support.microsoft.com/kb/319947>
<http://msdn.microsoft.com/en-us/library/system.web.configuration.compilationsection.numrecompilesbeforeapprestart.aspx>
將 numCompilesBeforeAppRestart 設置為更高的數字(或手動反彈您的 AppPool)將消除此問題。
您始終可以處理 Application_SessionStart 和 Application_SessionEnd 以在創建或結束會話時得到通知。HttpSessionState 類還有一個IsNewSession屬性,您可以檢查任何頁面請求以確定是否為活動使用者創建了新會話。
最後,如果在您的情況下可能的話,我已經成功地使用了SQL Server 會話模式。如果您在其中儲存大量數據(每個請求從 SQL Server 載入並保存全部數據),則不建議這樣做,如果您將自定義對象放入其中可能會很痛苦(因為它們必須是可序列化的),但它在我無法將我的 AppPool 配置為不回收幾個小時的共享託管方案中幫助了我。就我而言,我儲存了有限的資訊,並且對性能沒有不利影響。除此之外,現有使用者將預設重用他們的 SessionID,而我的使用者從未註意到他們的記憶體中 Session 被 AppPool 回收丟棄的事實,因為他們的所有狀態都儲存在 SQL Server 中。