Session state模式的健壯性
InProc:如果工作者進程(aspnet_wp.exe)進行資源回收或者應用程式定義域(appdomain)重啟動,session state就會丟失。這是因為session state是儲存在一個應用程式定義域的記憶體空間中的。對設定檔(如web.config和machine.config)的修改或者\bin目錄的任何改變(例如在你使用VS編譯應用程式後產生了一個新的dll)都可能引起重啟動,詳細請見KB324772。在1.0中,也有一個bug可能引起工作者進程重啟動,但這個bug在1.1中已經修複,見KB321792。
如果你使用的是IIS6.0,你可以在IIS Manager中找到Application Pools/DefaultAppPool,其中可以看到回收(Recycling)選項卡與效能(Performace)選項卡中是否有引起IIS工作者進程(w3svc.exe)停止工作的參數。
StateServer:解決了InProc模式的session state丟失問題。允許一個webfarm在中央伺服器中儲存session。只能在State Server上出現失敗。
SQLServer:與StateServer相似。session state的資料在SQL Server重啟後仍然保留著,你也可以按照KB311209的步驟使用SQL server failover cluster
Session 丟失的原因:
原因1:
bin目錄中的檔案被改寫,asp.net有一種機制,為了保證dll重新編譯之後,系統正常運行,它會重新啟動一次網站進程,這時就會導致Session丟失,所以如果有access資料庫位於bin目錄,或者有其他檔案被系統改寫,就會導致Session丟失。
詳見:http://support.microsoft.com/kb/324772
原因2:
檔案夾選項中,如果沒有開啟“在單獨的進程中開啟檔案夾視窗”,一旦建立一個視窗,系統可能認為是新的Session會話,而無法訪問原來的Session,所以需要開啟該選項,否則會導致Session丟失
原因3:
似乎大部分的Session丟失是用戶端引起的,所以要從用戶端下手,看看cookie有沒有開啟
原因4:
Session的時間設定是不是有問題,會不會因為逾時造成丟失
原因5:
IE中的cookie數量限制(每個域20個cookie)可能導致session丟失
原因6:
Global.asax或者Web.config檔案被更改.
防毒軟體可能會修改以上檔案.配置防毒軟體不要掃描.asax , .config檔案。配置
Web應用程式以out-of-process模式儲存Session.
詳見:http://support.microsoft.com/default.aspx?scid=kb;en-us;Q316148
原因7:
使用web garden模式,且使用了InProc mode作為儲存session的方式。
詳見:http://support.microsoft.com/kb/822171
原因8:
在 ASP.NET 中,在高負載情況下訪問工作階段狀態時,類比可能會丟失。 Microsoft 現在提供了受支援的修複程式.
詳見:http://support.microsoft.com/kb/324479/zh-cn
原因9:
設定檔中processModel標籤的memoryLimit屬性。
詳見:http://support.microsoft.com/kb/324772
原因10:
由於設定iis6的 應用程式集區內的效能內的最大web進程數導致的,由於session預設是存放在web進程裡的,進程開多了,導致session不能共用,每次重新整理又由不同的進程來處理。
原因11:
在IE6中使用FrameSet.
詳見:http://support.microsoft.com/kb/323752
參考:
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q324772
http://www.zaqi.net/files_view.asp?files_id=794
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q316148