程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> Session丟失原因與解決方案小結

Session丟失原因與解決方案小結

編輯:.NET實例教程

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網站。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved