win2003 server下的IIS6默認設置下對每個運行在默認應用池中的工作者進程都會經過20多個小時后自動回收該進程,造成保存在該進程中的session丟失。
因為Session,application等數據默認保存在運行該Web應用程序的工作者進程中,如果回收工作者進程,則會造成丟失。
解決辦法:
修改配置,設置為不定時自動回收該工作者進程,比如設置為當超出占用現有物理內存60%后自動回收
該進程。通過使用默認應用程序池,可以確保多個應用程序間互相隔離,保證由于一個應用程序的崩潰不會影響另外的Web應用程序。還可以使一個獨立的應用程序運行在一個指定的用戶帳號特權之下。
如果使用StateServer方式或者Sql Server數據庫方式來保存Session,則不受該設置的影響。
可能的原因2:
系統要運行在負載平衡的 Web 場環境中,而系統配置文件web.config中的Session狀態卻設置為InPRoc(即在本地存儲會話狀態),導至在用戶訪問量大時,Session常經超時的情況。引起這個現象的原因主要是因為用戶通過負載平衡ip來訪問WEB應用系統,某段時候在某臺服務器保存了Session的會話狀態,但在其它的WEB前端服務器中卻沒有保存Session的會話狀態,而隨著并發量的增大,負載平衡會當作路由隨時訪問空閑的服務器,結果空閑的服務器并沒有之前保存的Session會話狀態。
解決辦法:
1.當您在負載平衡的 Web 場環境中運行 asp.net Web 應用程序時,一定要使用 SqlServer 或 StateServer 會話狀態模式,在項目中我們基于性能考慮并沒有選擇SqlServer模式來存儲Session狀態,而是選擇一臺SessionStateServer 服務器來用戶的Session會話狀態。我們要在系統配置文件web.config中設置如下:
<sessionState mode="StateServer" cookieless="false" timeout="240" stateConnectionString="tcpip=192.168.0.1:42424" stateNetworkTimeout="14400" />
還要添加一項
<machineKey validationKey="78AE3850338BFADCE59D8DDF58C9E4518E7510149C46142D7AAD7F1AD49D95D4" decryptionKey="5FC88DFC24EA123C" validation="SHA1"/>
2. 我們同時還要在SessionStateServer 服務器中啟動ASP.NET State Service服務,具體設置:控制面板>>管理工具>>服務>>ASP.NET State Service,把它設為自動啟動即可。
3. 每臺前端WEB服務的Microsoft“Internet 信息服務”(IIS)設置
要在 Web 場中的不同 Web 服務器間維護會話狀態,Microsoft“Internet 信息服務”(IIS) 配置數據庫中 Web 站點的應用程序路徑(例如,/LM/W3SVC/2)與 Web 場中所有 Web 服務器必須相同。大小寫也必須相同,因為應用程序路徑是區分大小寫的。在一臺 Web 服務器上,承載 ASP.NET 應用程序的 Web 站點的實例 ID 可能是 2(其中應用程序路徑是 /LM/W3SVC/2)。在另一臺 Web 服務器上,Web 站點的實例 ID 可能是 3(其中應用程序路徑是 /LM/W3SVC/3)。因此,Web 場中的 Web 服務器之間的應用程序路徑是不同的。我們必須使Web 場Web 站點的實例 ID 相同即可。你可以在IIS中把某一個WEB配置信息保存為一個文件,其他Web 服務器的IIS配置可以來自這一個文件。您如果想知道具體的設置請訪問Microsoft Support網站。
新聞熱點
疑難解答