網站應用程式經常使用工作階段 (Session) 來記錄一些相關資訊,方便在某些情境上使用。在 IIS,保存 Session 有多種方式,包含 處理中 (InProc)自訂 (Custom)狀態伺服器 (StateServer)SQL Server ...等幾中方式 。在單一 IIS 伺服器情況,我們會設定為 處理中 (InProc),因為沒有負載平行 (Load balancer) 需求,所以不需要將 Session 取出與其他 IIS 進行分享。

但在有負載平行架構下,倘若沒有將 Session 取出並進行管理,會發生無法取得 Session 的情況下,網站運作即可能發生問題。常見的 SessionState  (工作階段狀態) 有:
1. 狀態伺服器:透過 ASP.NET State Service 來儲存 Session ,啟動時需要確認此服務有啟動
2. SQL Server:透過 SQL Server 來儲存 Session,理所當然,你需要一台 SQL Server
3. 自訂:常見是透過 Redis 來作為 Session 儲存狀態,你需要透過套件與一台 Redis Server

這些方式各有優、缺點,有些效能就好;有些則可以儲存大量 Session;有些則需要額外服務才能使用。如何使用則依據您的需求而定。本篇文章將簡單介紹在 在 IIS 上如何使用 SQL Server 保存工作階段,若有任何錯誤或建議,請各為前輩不吝提出,謝謝。







整個過程分成兩個階段:



透過 aspnet_regsql.exe 建立 SessionState 所需要資料庫


aspnet_regsql.exe 位於  C:\Windows\Microsoft.NET\Framework\[版本號碼]\aspnet_regsql.exe (無論用 2.x 版或 4.x 板皆可)。




你可以開啟命令提示字元 (command line),直接輸入下列指令切換目錄
cd C:\Windows\Microsoft.NET\Framework\v4.0.30319\




接下來,你可以輸入下列指令,來查詢如何使用
aspnet_regsql.exe -? 





大致上需要注意的參數是
-S: 伺服器名稱 (位址)
-U: SQL Server 登入帳號
-P: SQL Server 登入密碼
-E: 使用目前 windows 登入者資訊登入 (適用於有開啟 Windows 驗證的 SQL Server)

-ssadd: 在 SQL Server 加入新的 Session 支援
-ssremove: 在SQL Server 移除 Session 支援
-sstype: t 表示暫存,將資料存於 SQL Server 內 tempdb;p 永久保存,會建立一個資料庫 ASPState 資料庫儲存資料;c 表示自訂資料庫進行儲存
-d: 當你的sstype 參數給 c 時,你可以透過 -d 自訂資料庫名稱


下面舉幾個指令範例:
1. 透過目前 Windows 登入資訊,在本機 SQL Server 建立 ASPState 資料庫儲存 Session State 資料庫
aspnet_regsql.exe –S . -E -ssadd -sstype p


2. 在 DESKTOP-AP 上,透過 sa 與 密碼,建立 ASPState 資料庫儲存 Session State 資料庫
aspnet_regsql.exe -S DESKTOP-AP -U sa -P pw -ssadd -sstype p


3. 在 DESKTOP-AP上,透過 sa 與 密碼,建立 MyASPState 資料庫儲存 Session State 資料庫
aspnet_regsql.exe -S DESKTOP-AP -U sa -P pw -ssadd -sstype c -d MyASPState


下列是執行結果:



您可以透過 SSMS 連線到資料庫,可以發現新增了 ASPState 資料庫


逐一設定站台 Web.conifg 內 SessionState


若是沒有自訂資料庫名稱,透過 Windows 驗證,則在該站台底下 web.config 內,system.web 內加上


若是自訂資料庫名稱,透過 Windows 整合驗證,則在該站台底下 web.config 內,system.web 內加上:


若是自訂資料庫名稱,透過 SQL Server 帳號/密碼驗證,則在該站台底下 web.config 內,system.web 內加上:



理所當然,你也可開啟 IIS > 點選站台 > 工作階段狀態 (SessionState),直接透過圖形化介面方式設定 (兩者擇一即可)








以上,即完成設定

備註:正常情況下,每一類型應用程應該有自己的資料庫儲存 Session State 資料,不同類型的網站不應該共用相同資料庫。