在WEB場中,動態網頁往往會因為幾臺主機做了負載而產生SESSION丟失的問題,網上也有很多的介紹,我這里只將我經歷的過程給大家分享一下:
系統要運行在負載平衡的 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" />
這里的紅字體的IP一定要是同域的一臺機器,在這臺機器上進行第二步的操作,同時將其注冊表中HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Servi ces\aspnet_state\Parameter
s\AllowRemoteConnection的鍵值改為1,然后重啟本機的ASP.NET State Service服務
還要添加一項
<machineKey validationKey="78AE3850338BFADCE59D8DDF58C9E4518E7510149C46142D7AAD7F1AD49D95D4" decryptionKey="5FC88DFC24EA123C" validation="SHA1"/>
如何生成machineKey?
按照MSDN的標準說法:“對密鑰進行配置,以便將其用于對 Forms 身份驗證 Cookie 數據和視圖狀態數據進行加密和解密,并將其用于對進程外會話狀態標識進行驗證。”也就是說Asp.Net的很多加密,都是依賴于machineKey里面的值,例如Forms 身份驗證 Cookie、ViewState的加密。默認情況下,Asp.Net的配置是自己動態生成,如果單臺服務器當然沒問題,但是如果多臺服務器負載均衡,machineKey還采用動態生成的方式,每臺服務器上的machinekey值不一致,就導致加密出來的結果也不一致,不能共享驗證和ViewState,所以對于多臺服務器負載均衡的情況,一定要在每臺站點配置相同的machineKey。
machineKey生成的算法:
1 2 3 4 5 6 7 8 9 10 11 12 13 | validationKey?=?CreateKey(20); decryptionKey?=?CreateKey(24); protected ?string ?CreateKey( int ?len) { byte []?bytes?=? new ?byte [len]; new ?RNGCryptoServiceProvider().GetBytes(bytes); StringBuilder?sb?=? new ?StringBuilder(); for ( int ?i?=?0;?i?<?bytes.Length;?i++) { sb.Append( string .Format( "{0:X2}" ,bytes[i])); } return ?sb.ToString(); } |
附參考的matchineKey配置:
1 2 3 4 5 6 7 | <? xml ?version = "1.0" ?> < configuration > < system.web > < machineKey ?validationKey = "3FF1E929BC0534950B0920A7B59FA698BD02DFE8" ?decryptionKey = "280450BB36319B474C996B506A95AEDF9B51211B1D2B7A77" ?decryption = "3DES" ?validation = "SHA1" /> </ system.web > </ configuration > |
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網站:http://support.microsoft.com/default.aspx?scid=kb;zh-cn;325056