Session 是無狀態 Web 應用維持使用者狀態的核心機制。ASP.NET 1.1 提供三種儲存模式,並透過 SessionStateModule 整合至 HTTP 管線。
| 模式 | 儲存位置 | 序列化 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|---|---|
| InProc (預設) | aspnet_wp.exe 進程記憶體 | 否 (物件引用) | 效能最快、支援任意物件 | 進程回收遺失、不支援 Web Garden/叢集 | 單伺服器、小型應用、開發環境 |
| StateServer | aspnet_state.exe (獨立進程/遠端機器) | 是 | 進程隔離、支援 Web Garden/叢集 | 序列化開銷、網路延遲、單點故障 | Web Garden、多伺服器叢集、需進程回收保持 |
| SQLServer | SQL Server 資料表 (ASPState) | 是 | 高可用、支援叢集/異地備援、資料持久 | 效能最低、需 SQL 授權、序列化限制 | 企業級、跨資料中心、法規要求持久化 |
BeginRequest:模組啟動,讀取 web.config <sessionState> 決定模式。IStateClientManager (InProc/StateServer/SQLServer)。
3. AcquireRequestState:從提供者反序列化 Session 資料 → HttpSessionState 字典 → 綁定 Context.Session / Page.Session。
4. 執行頁面邏輯,開發者讀寫 Session["Key"]。
5. ReleaseRequestState:若 Session 有變更,序列化回提供者;鎖定釋放。
6. EndRequest:完成。
<sessionState mode="SQLServer"
sqlConnectionString="Server=DB;UID=sa;PWD=***;"
cookieless="false"
timeout="30"
allowCustomSqlDatabase="true" />
cookieless="UseUri":將 SessionID 嵌入 URL (如 /(S(abc123))/page.aspx),支援禁用 Cookie 瀏覽器。timeout:閒置分鐘數,預設 20,滑動過期。<pages enableSessionState="false" /> 或控件 EnableSessionState="ReadOnly"。
3. StateServer 高可用:叢集部署 aspnet_state.exe,設定多台備援 IP。
4. SQLServer 優化:ASPState 資料庫置於獨立磁碟/檔案群組,啟用 READ_COMMITTED_SNAPSHOT 減少鎖定。
5. 監控:效能計數器 ASP.NET Applications\Sessions Total/Active/Timed Out。
僅 InProc 模式** 支援 Global.asax Session_End。StateServer/SQLServer 無法可靠觸發,清理邏輯請改用排程作業 (SQL Agent Job) 掃描過期 Session 資料表。