Session 識別同一瀏覽器與伺服器的一次會話。首次請求觸發 Session_OnStart,超時/關閉觸發 Session_OnEnd。使用需確保:
EnableSessionState="true|ReadOnly"<sessionState> 正確配置<sessionState mode="Off" />
完全禁用,節省資源,適合無狀態頁面。
<sessionState mode="InProc" />
| 優點 | 缺點 |
|---|---|
| 性能最快(進程內記憶體直接讀寫) | IIS 重啟/回收/崩潰 → Session 全部丟失 |
| 配置最簡單 | Web 伺服器陣列無法共享 Session |
| 支援任意可序列化物件 | 大量 Session 佔用工作進程記憶體,易導致 OOM |
<sessionState mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
cookieless="false" timeout="20" />
aspnet_state (ASP.NET State Service)
<sessionState mode="SQLServer"
sqlConnectionString="data source=127.0.0.1;user id=sa;password=xxx;Trusted_Connection=yes"
cookieless="false" timeout="20" />
InstallSqlState.sql (路徑:%Windir%\Microsoft.NET\Framework\\ )osql -S (local) -U sa -P "" -i InstallSqlState.sql| 場景 | 推薦模式 | 理由 |
|---|---|---|
| 單伺服器、小流量、容忍重啟丟失 | InProc | 零配置、最高性能 |
| Web 伺服器陣列、需共享 Session | StateServer | 進程外共享、配置簡單、性能折中 |
| 高可用要求、Session 持久化、跨機房 | SQLServer | 資料庫級高可用、支援叢集 |
| 無狀態 API、靜態內容站點 | Off | 節省資源 |
| 大量 Session 數據、記憶體壓力大 | SQLServer 或 StateServer | 釋放 w3wp 記憶體 |
| 屬性 | 說明 | 建議值 |
|---|---|---|
| timeout | 閒置超時分鐘數 | 20 (預設),視業務調整 |
| cookieless | 無 Cookie 模式 (URL 嵌入 SessionID) | false (預設),SEO/安全建議 false |
| regenerateExpiredSessionId | 過期 ID 重新生成 | true |
| partitionResolverType | 自定義分區解析器 (多資料庫分片) | 大型系統擴展用 |
ASP.NET_SessionId Cookie 攜帶/sessionid/page.aspx,適用於禁用 Cookie 客戶端ISessionIDManager 完全控制 ID 生成/驗證/儲存Session.Remove("key")、Session.Clear()、Session.Abandon()EnableSessionState="ReadOnly",避免寫入鎖定[Serializable] 或實作 ISerializable「Session 是雙刃劍:用得好是狀態管理利器,用不好是效能殺手。」—— 根據架構演進選擇模式:單機 → InProc;叢集 → StateServer;金融/高可用 → SQLServer;微服務 → 分散式緩存。