Netowork LoadBalance下ASP.NET工作階段的Session states如何處理?

在靜態網頁之下,若架構以NLB(Network Load Balance)做Active/Active mode是沒有什麼太大的問題,因為靜網頁並沒有工作處理的狀態問題
但是如果想要達成在動態網頁之下,使網站服務可以達成完全loadbalance,這時侯,我們常常應用的一些互動性的功能可能會出現問題
原因就出在當有使用互動性的功能時,Session States是直接存在處理服務的那台伺服器上 …

在靜態網頁之下,若架構以NLB(Network Load Balance)做Active/Active mode是沒有什麼太大的問題,因為靜網頁並沒有工作處理的狀態問題
但是如果想要達成在動態網頁之下,使網站服務可以達成完全loadbalance,這時侯,我們常常應用的一些互動性的功能可能會出現問題
原因就出在當有使用互動性的功能時,Session States是直接存在處理服務的那台伺服器上
你可能填寫問卷填的比較久,當你按下送出時,已經被NLB切到另一台伺服器上了,這時你的工作階段則沒有轉移至這台伺服器
而有可能使的互動性的功能完全的喪失,除非運氣好不然這種狀況應該會讓你的客戶把你打個半死。

那麼在NLB架構之下,又使用的是完全Loadbalance有什麼方法可以將Session Stats讓每台伺服器都能接續下去呢?
全都存一份到所有的服務成員伺服器?還是找個Shared Storage來存放呢?其實我們可以透過SQL Server將資料轉存下去
這麼一來,即使是硬體的Loadbalance設備,而且負載的規則是依照負載狀況而定的這種架構也可以適用。

首先,我們必須先設定將SQL Server設定成可存放Session States,在SQL Server上開啟InstallSqlState.sql到Query Analyzer(SQL 2K及2K5都通用)執行
路徑置放於system drive\WinDir\Microsoft.NET\Framework\version\,一般是放在C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727之中
這樣子就好了嗎???當然還沒有呀!這樣只是在SQL Server上建立一個資料庫(ASPState)供Web將Session States存放至SQL

但是Web Server怎麼會把Session States丟到SQL Server上存放呢?此時,我們必須先在SQL Server上建立一個可連線的資料庫使用者
並且他對於ASPState這個資料庫要是DBOwner的身份,這樣它才能將各種資訊依照需求來建立或刪減資料表、預存程序…等

接下來我們只要在Web.conf檔中,加上這一行程式碼即可讓web將session sates存至SQL Server在加完下面這一行程式碼後,請記得將IISADMIN重啟讓它生效

<configuration>
  <system.web>
    <sessionState mode="SQLServer"  
     sqlConnectionString="data source=<SQL Server IP or Name>;user id=<username>;password=<strongpassword>"  
     cookieless="false"  
     timeout="20" />
  </system.web>
</configuration>

 

謝謝JamesWu大大的提醒,在NLB的架構下,伺服器會隨機的自動產生一組Key以供識別用,但是若沒有在web.config中設定好這組key,有可能在轉移的時侯有可能會產生無法解View states或是cookies的問題
因此除了JamesWu大大所寫的Validation of viewstate MAC failed 驗證ViewState時 MAC 失敗 以外
下面這個連結是可以直接取得這把machineKey的產生器供大家參考,謝謝大家!!
ASP.NET machineKey Generator

MSDN也有相關的資料可供參考:machineKey Element (ASP.NET Settings Schema)


Anything keeps Availability.
Anywhere keeps Integrity.
Anytime keeps Confidentiality.
keep A.I.C. = Information Security