今天有同事請我幫忙設定讓 ASP.NET 網站能改用 SQL Server 當作 工作階段狀態 (Session State) 的提供者,剛好乘機將設定的過程筆記一下,其實設定過方法並不複雜,只要下幾個指令並修改 web.config 即可完成,總共也只有幾個步驟而已,其中的注意事項我也會提到一些。
要使用 SQL Server 當作 工作階段狀態 (Session State) 的提供者,主要只有兩個步驟:
- 建立 工作階段狀態 (Session State) 所需的資料庫
- 修改 ASP.NET 網站的 web.config
一、建立 工作階段狀態 (Session State) 所需的資料庫
建立 Session State 專用的資料庫在安裝完 Microsoft .NET Framework 執行環境後就會有一支程式可以幫你自動建立所需的資料庫(注意:不需要安裝 SDK 就有這個工具),此工具程式的路徑如下:
C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe
在命令提示字元輸入 C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe -? 即可取得完整的使用說明,其中就有關於「工作階段狀態選項」的說明,如下圖示:
除了「SQL 連接選項」非常重要外,在「工作階段狀態選項」裡也有幾個重要的選項以及注意事項,那就是 –sstype 這個選項,他區分了三種支援的類型,看上圖的中文說明應該能獲得理解,但我還是特別提醒一下,由於 ASP.NET 裡面的 Session State 經常會儲存一些重要的資訊,例如購物車資訊、會員的登入狀態等等,如果你今天沒有輸入 –sstype 選項的話,預設會是 t: 暫存,也代表著若 SQL Server 重新啟動或 Fail-over 之後,所有的 Session 資料將會消失不見。(因為 SQL Server 只要重新啟動就會重建 tempdb 系統資料庫,所以所有 Session 資料都將會被清空)
所以一般對於 Session 資料完整性比較嚴謹的網站,通常會選擇 p: 永續性 的方式來建立資料庫,這樣一來就算 SQL Server 重新啟動也不會導致 Session 資料流失的問題。
以下是幾個常見的指令執行範例:
[ 安裝工作階段狀態資料庫 ]
請先進入 C:\Windows\Microsoft.NET\Framework\v2.0.50727 目錄再執行以下指令:
* 使用 Windows 驗證連線 ( 信任式連線 )
aspnet_regsql.exe –S . -E -ssadd -sstype p
* 使用 SQL Server 驗證連線 ( 請將 sa 換成 SQL Server 登入帳號、將 pw 換成 SQL 登入密碼 )
aspnet_regsql.exe -S . -U sa -P pw -ssadd -sstype p
* 使用自訂的資料庫名稱
aspnet_regsql.exe -S . -E -ssadd -sstype c –d MySessionDB
[ 移除工作階段狀態資料庫 ]
請先進入 C:\Windows\Microsoft.NET\Framework\v2.0.50727 目錄再執行以下指令:
* 使用 Windows 驗證連線 ( 信任式連線 )
aspnet_regsql.exe –S . -E -ssremove -sstype p
* 使用 SQL Server 驗證連線 ( 請將 sa 換成 SQL Server 登入帳號、將 pw 換成 SQL 登入密碼 )
aspnet_regsql.exe -S . -U sa -P pw -ssremove -sstype p
在安裝完成之後,你會發現 SQL Server 會有一些物件與作業被建立,如下解說:
1. 預設資料庫名稱為 ASPState
2. 建立兩個資料表 ASPStateTempApplications 與 ASPStateTempSessions
3. 建立多個所需的預存程序
4. 並且會在 SQL Server Agent 裡建立一個 ASPState_Job_DeleteExpiredSessions 作業,用來定時清理過期的 Session 資料,而且預設每分鐘就會自動執行一次:
如果你想要得到建立這個資料庫的完整 DDL 指令碼,可以使用以下指令匯出指令碼,如此以來你可以更進一步的分析 aspnet_regsql.exe 到底對資料庫下了哪些 T-SQL 指令:
aspnet_regsql.exe -E -S . -ssadd -sstype p -sqlexportonly c:\Create_ASPState.sql
執行完以上指令後,即可獲得 c:\Create_ASPState.sql 指令檔。
§ 請注意:由於 SQLEXPRESS 不支援 SQL Server Agent,這會導致 Session 資料不會自動被清除,資料庫只要跑得越久 Session 資料就會越多,直到資料庫大小到達限制的容量時 ASP.NET 就會發生無法寫入 Session 的錯誤,因此需自行透過 sqlcmd 指令在 ASPState 資料庫執行以下預存程序並設定到工作排程中定時執行才可以:
EXECUTE DeleteExpiredSessions
二、修改 ASP.NET 網站的 web.config
其 web.config 中使用 SQLServer 工作階段狀態模式的語法如下:
[使用預設的 ASPState 資料庫名稱]
<sessionstate mode="SQLServer" timeout="60″
sqlconnectionstring="Data Source=Server;Integrated-Security=SSPI;"
cookieless="false">
[使用自訂的資料庫名稱]
<sessionState mode="SQLServer" allowCustomSqlDatabase="true"
sqlConnectionString="Server=.;Database=ASPState;Integrated Security=true"
sqlCommandTimeout="60″
cookieless="false" cookieName="ASP.NET_SessionId" timeout="60″ />