Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> 電腦軟體教學 >> 伺服器技術 >> 關於伺服器

ASP.NET Session 狀態伺服器完整部署指南:StateServer 與 SQLServer 模式實戰

編輯:關於伺服器

核心概念:Session、SessionID 與 Cookie

Session 資料儲存在伺服器端,客戶端僅保留 ASP.NET_SessionId Cookie。瀏覽器每次請求攜帶此 Cookie,伺服器以此關聯使用者狀態。若 Cookie 遺失或超過 20 個上限,Session 將中斷,需在程式碼中備份/還原 SessionID Cookie(見文中程式碼範例)。

五種 Session 模式對照

模式儲存位置效能適用場景
Off停用—無 Session 需求
InProcIIS 工作進程記憶體最高單機、非關鍵資料
StateServeraspnet_state.exe 獨立程序-10~15%Web Farm、中小流量
SQLServerSQL Server 資料庫-10~20%高可用、大型叢集、資料持久化
Custom自訂提供者視實作Redis、MongoDB 等非關聯式儲存

StateServer 模式部署步驟

  1. 伺服器端:啟動 aspnet_state 服務 (設為自動),修改登錄檔 AllowRemoteConnection=1、Port=42424。
  2. 客戶端 Web.config:
    <sessionState mode="StateServer" stateConnectionString="tcpip=192.168.1.100:42424" cookieless="false" timeout="60" />
  3. 所有 Web 伺服器 MachineKey 必須一致,IIS Metabase 中應用程式路徑 (如 /LM/W3SVC/1/ROOT) 大小寫需完全相同。
  4. 確認 Machine.config 已載入 SessionStateModule。

SQLServer 模式部署步驟

  1. 建立 Session 資料庫:
    ASP.NET 1.x 執行 InstallSqlState.sql;
    ASP.NET 2.0+ 使用 aspnet_regsql.exe -S . -E -ssadd -sstype p (建立 ASPState 資料庫) 或 -sstype c -d CustomDB (自訂資料庫)。
  2. 客戶端 Web.config:
    預設資料庫:<sessionState mode="SQLServer" sqlConnectionString="server=192.168.1.100;uid=sa;pwd=***" />
    自訂資料庫:<sessionState mode="SQLServer" allowCustomSqlDatabase="true" sqlConnectionString="server=192.168.1.100;database=MyAspState;uid=sa;pwd=***" />
  3. 啟用 SQL Server Agent 服務,確保過期 Session 清理作業執行。
  4. 同 StateServer:MachineKey 一致、應用程式路徑一致。

實戰經驗與避坑指南

StateServer

  • 不支援負載平衡 (單點故障),高併發建議改 SQLServer。
  • 儲存物件必須 [Serializable]。

SQLServer

  • 連線帳號需具備 ASPState 與 tempdb 的 db_owner 權限。
  • 大量 Session 寫入易成資料庫瓶頸,建議啟用讀取認可快照隔離級別 (RCSI)。

Session 通用

  • 滑動過期 (Sliding Expiration):每次請求重設計時器。
  • 儲存值型別 (int, string) 效能最佳,避免放入大型物件圖。
  • 跨應用程式/虛擬目錄無法共用 Session。

SessionID 行為

  • 關閉瀏覽器 → SessionID 重置。
  • IE 6 每視窗獨立 SessionID;Firefox 分頁共用。
  • cookieless="UseUri" 可將 SessionID 嵌入 URL,但有安全風險。

Session_End 事件限制

  • 僅 InProc 模式觸發。
  • 非由 HTTP 請求觸發,無 HttpContext,不可用 Response.Redirect、Server.Transfer。
  • 以背景執行緒 (aspnet_wp.exe 身分) 執行,資料庫連線需注意權限。

結語

作者已在生產環境以 SQLServer 模式實現多台伺服器 Session 共用,重啟 IIS 不影響使用者預訂流程。部署時務必做好 MachineKey 同步、資料庫維護計畫與監控告警,確保高可用性。

Copyright © Windows教程網 All Rights Reserved