asp.net 負載均衡下session存儲的解決方法

轉自:http://www.cnblogs.com/david100zhang/archive/2011/12/28/2304917.html

在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_MACHINESYSTEMCurrentControlSetServi cesaspnet_stateParameter

sAllowRemoteConnection的鍵值改為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生成的演算法:

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配置:

<?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 站點的應用程序路徑(例如,LMW3SVC2)與 Web 場中所有 Web 伺服器必須相同。大小寫也必須相同,因為應用程序路徑是區分大小寫的。在一台 Web 伺服器上,承載 ASP.NET 應用程序的 Web 站點的實例 ID 可能是 2(其中應用程序路徑是 LMW3SVC2)。在另一台 Web 伺服器上,Web 站點的實例 ID 可能是 3(其中應用程序路徑是 LMW3SVC3)。因此,Web 場中的 Web 伺服器之間的應用程序路徑是不同的。我們必須使Web 場Web 站點的實例 ID 相同即可。你可以在IIS中把某一個WEB配置信息保存為一個文件,其他Web 伺服器的IIS配置可以來自這一個文件。您如果想知道具體的設置請訪問Microsoft Support網站:http://support.microsoft.com/default.aspx?scid=kb;zh-cn;325056

必須要看的:http://www.rrtgw.com

補充一些相關資料:

PRB: Session Variables Are Lost If You Use FRAMESET in Internet Explorer 6.0

http://support.microsoft.com/kb/323752/EN-US/#

PRB: Session Data Is Lost When You Use ASP.NET InProc Session State Mode

http://support.microsoft.com/?id=324772

PRB:如果您使用 SqlServer 或 StateServer 會話模式 Web 場中會丟失會話狀態

http://support.microsoft.com/default.aspx?scid=kb;zh-cn;325056

ASP.NET Session State FAQ

http://www.eggheadcafe.com/articles/20021016.asp


推薦閱讀:

mutt群發郵件,轉發,查詢,存儲
將GIF動圖轉存到了大腸桿菌:DNA能像硬碟一樣存儲信息
【要聞】國家存儲器基地項目武漢光谷開工
選區的存儲及載入

TAG:方法 | 解決方法 | session | 負載均衡 | 存儲 |