ASP.NET中Session丟失原因與解決方案小結(jié)

2010-08-28 10:51:18來(lái)源:西部e網(wǎng)作者:

  win2003 server下的IIS6默認(rèn)設(shè)置下對(duì)每個(gè)運(yùn)行在默認(rèn)應(yīng)用池中的工作者進(jìn)程都會(huì)經(jīng)過(guò)20多個(gè)小時(shí)后自動(dòng)回收該進(jìn)程,造成保存在該進(jìn)程中的session丟失。

  因?yàn)镾ession,Application等數(shù)據(jù)默認(rèn)保存在運(yùn)行該Web應(yīng)用程序的工作者進(jìn)程中,如果回收工作者進(jìn)程,則會(huì)造成丟失。

  解決辦法:

  修改配置,設(shè)置為不定時(shí)自動(dòng)回收該工作者進(jìn)程,比如設(shè)置為當(dāng)超出占用現(xiàn)有物理內(nèi)存60%后自動(dòng)回收該進(jìn)程。通過(guò)使用默認(rèn)應(yīng)用程序池,可以確保多個(gè)應(yīng)用程序間互相隔離,保證由于一個(gè)應(yīng)用程序的崩潰不會(huì)影響另外的Web應(yīng)用程序。還可以使一個(gè)獨(dú)立的應(yīng)用程序運(yùn)行在一個(gè)指定的用戶(hù)帳號(hào)特權(quán)之下。

  如果使用StateServer方式或者Sql Server數(shù)據(jù)庫(kù)方式來(lái)保存Session,則不受該設(shè)置的影響。

  可能的原因2

  系統(tǒng)要運(yùn)行在負(fù)載平衡的 Web 場(chǎng)環(huán)境中,而系統(tǒng)配置文件web.config中的Session狀態(tài)卻設(shè)置為InProc(即在本地存儲(chǔ)會(huì)話(huà)狀態(tài)),導(dǎo)至在用戶(hù)訪問(wèn)量大時(shí),Session常經(jīng)超時(shí)的情況。引起這個(gè)現(xiàn)象的原因主要是因?yàn)橛脩?hù)通過(guò)負(fù)載平衡IP來(lái)訪問(wèn)WEB應(yīng)用系統(tǒng),某段時(shí)候在某臺(tái)服務(wù)器保存了Session的會(huì)話(huà)狀態(tài),但在其它的WEB前端服務(wù)器中卻沒(méi)有保存Session的會(huì)話(huà)狀態(tài),而隨著并發(fā)量的增大,負(fù)載平衡會(huì)當(dāng)作路由隨時(shí)訪問(wèn)空閑的服務(wù)器,結(jié)果空閑的服務(wù)器并沒(méi)有之前保存的Session會(huì)話(huà)狀態(tài)。

  解決辦法

  1.當(dāng)您在負(fù)載平衡的 Web 場(chǎng)環(huán)境中運(yùn)行 ASP.NET Web 應(yīng)用程序時(shí),一定要使用 SqlServer 或 StateServer 會(huì)話(huà)狀態(tài)模式,在項(xiàng)目中我們基于性能考慮并沒(méi)有選擇SqlServer模式來(lái)存儲(chǔ)Session狀態(tài),而是選擇一臺(tái)SessionStateServer 服務(wù)器來(lái)用戶(hù)的Session會(huì)話(huà)狀態(tài)。我們要在系統(tǒng)配置文件web.config中設(shè)置如下:

<sessionState mode="StateServer" cookieless="false" timeout="240" stateConnectionString="tcpip=192.168.0.1:42424" stateNetworkTimeout="14400" />

  還要添加一項(xiàng)

<machineKey validationKey="78AE3850338BFADCE59D8DDF58C9E4518E7510149C46142D7AAD7F1AD49D95D4" decryptionKey="5FC88DFC24EA123C" validation="SHA1"/> 

  2. 我們同時(shí)還要在SessionStateServer 服務(wù)器中啟動(dòng)ASP.NET State Service服務(wù),具體設(shè)置:控制面板>>管理工具>>服務(wù)>>ASP.NET State Service,把它設(shè)為自動(dòng)啟動(dòng)即可。 

  3. 每臺(tái)前端WEB服務(wù)的Microsoft“Internet 信息服務(wù)”(IIS)設(shè)置

  要在 Web 場(chǎng)中的不同 Web 服務(wù)器間維護(hù)會(huì)話(huà)狀態(tài),Microsoft“Internet 信息服務(wù)”(IIS) 配置數(shù)據(jù)庫(kù)中 Web 站點(diǎn)的應(yīng)用程序路徑(例如,\LM\W3SVC\2)與 Web 場(chǎng)中所有 Web 服務(wù)器必須相同。大小寫(xiě)也必須相同,因?yàn)閼?yīng)用程序路徑是區(qū)分大小寫(xiě)的。在一臺(tái) Web 服務(wù)器上,承載 ASP.NET 應(yīng)用程序的 Web 站點(diǎn)的實(shí)例 ID 可能是 2(其中應(yīng)用程序路徑是 \LM\W3SVC\2)。在另一臺(tái) Web 服務(wù)器上,Web 站點(diǎn)的實(shí)例 ID 可能是 3(其中應(yīng)用程序路徑是 \LM\W3SVC\3)。因此,Web 場(chǎng)中的 Web 服務(wù)器之間的應(yīng)用程序路徑是不同的。我們必須使Web 場(chǎng)Web 站點(diǎn)的實(shí)例 ID 相同即可。你可以在IIS中把某一個(gè)WEB配置信息保存為一個(gè)文件,其他Web 服務(wù)器的IIS配置可以來(lái)自這一個(gè)文件。

關(guān)鍵詞:ASP.NET

贊助商鏈接: