在 ASP.NET 應用程式中,使用 Session 儲存使用者登入資訊是常見做法。然而,有時會遇到詭異現象:使用者明明已登入,重新整理頁面卻發現 Session 遺失,導致顯示未登入狀態;再重新整理一次,Session 又神奇地恢復了。這種「忽有忽無」的行為極難除錯,嚴重影響使用者體驗與系統可靠度。
經過兩天深入排查,最終發現問題源於 IIS 6.0 應用程式集區的「最大背景工作進程數」設定。預設情況下,ASP.NET Session 以 InProc 模式儲存於單一背景工作進程的記憶體中。當應用程式集區設定多個背景工作進程(Web Garden 模式)時,每個進程擁有獨立的記憶體空間,Session 無法在進程間共享。
具體流程如下:
這解釋了為何在本機測試多個帳號登入後,重新整理會出現不同使用者或未登入狀態的現象。
| 方案 | 原理 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|---|
| StateServer 模式 | 啟用 ASP.NET 狀態服務,Session 序列化儲存於獨立進程 | 進程隔離、支援 Web Garden/Web Farm、效能優於 SQLServer | 需啟用 Windows 服務、序列化開銷、單點故障風險 | 中小型專案、需支援多進程部署 |
| SQLServer 模式 | Session 序列化儲存於 SQL Server 資料庫 | 高可用性、支援叢集、資料持久化、跨伺服器共享 | 效能最低、需授權成本、資料庫維護負擔 | 大型企業應用、Web Farm、需資料持久化 |
| 自訂分散式快取 | 使用 Redis、Memcached 等記憶體資料庫 | 高效能、高擴展性、豐富資料結構、支援 TTL | 需額外基礎建設、序列化設計、運維複雜度較高 | 高併發、微服務架構、雲原生應用 |
| Cookie/Token 儲存 | 將使用者資訊加密儲存於客戶端 | 無伺服器端狀態、天然支援擴展、簡單部署 | 資料量限制(4KB)、安全性風險、頻寬開銷 | 輕量級應用、無狀態 API、單頁應用(SPA) |
# 以管理員身分執行命令提示字元
net start aspnet_state
# 設定為自動啟動
sc config aspnet_state start= auto
<configuration>
<system.web>
<sessionState
mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
cookieless="false"
timeout="20" />
</system.web>
</configuration>
關鍵參數說明:
stateConnectionString:狀態服務 IP 與埠號,預設 42424cookieless:是否使用無 Cookie 模式 (URL 嵌入 Session ID)timeout:Session 逾時分鐘數<machineKey
validationKey="AutoGenerate,IsolateApps"
decryptionKey="AutoGenerate,IsolateApps"
validation="SHA1"
decryption="AES" />
在多伺服器環境中,所有節點必須使用相同的 machineKey 以確保 Session 資料正確解密。
protected void Page_Load(object sender, EventArgs e)
{
System.Diagnostics.Debug.WriteLine($"SessionID: {Session.SessionID}, IsNewSession: {Session.IsNewSession}");
// 輸出至 Visual Studio 輸出視窗或日誌系統
}
int processId = System.Diagnostics.Process.GetCurrentProcess().Id;
System.Diagnostics.Debug.WriteLine($"Worker Process ID: {processId}");
觀察不同請求的 Process ID 是否固定,可快速確認 Web Garden 效應。
requireSSL="true"、定期輪換機器金鑰Session 「忽有忽無」的核心成因是 InProc 模式不支援多進程架構。透過改用 StateServer 或 SQLServer 模式,將 Session 移出進程記憶體,即可徹底解決 Web Garden 環境下的 Session 共享問題。選擇何種方案應根據系統規模、效能需求、維運能力綜合評估。現代雲原生架構下,推薦採用 Redis 等分散式快取方案,兼顧效能與擴展性。