首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

ASP.NET Session 狀態存儲模式深度解析:InProc、StateServer、SQL Server 三大方案實測對比

     編輯:關於SqlServer

實驗準備:SessionState.aspx 測試頁

頁面包含兩個按鈕:Add to Session State(寫入)與 View Session State(讀取),配合 Session_Add、CheckSession 後端方法,可直觀驗證 Session 是否丟失。

模式一:InProc(進程內,默認)

<sessionState mode="InProc" 
  stateConnectionString="tcpip=127.0.0.1:42424"
  sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
  cookieless="false" timeout="20" />
  • Session 存儲於 IIS 工作進程(w3wp.exe)內存
  • 優點:性能最高,讀寫最快
  • 缺點:IIS 重啟、應用程序池回收、服務器重啟均導致 Session 全部丟失
  • 實測:右鍵 IIS 節點選「重新啟動 IIS」→ Session 瞬間丟失

模式二:StateServer(進程外,獨立進程)

  1. 啟動服務:ASP.NET State Service(進程名 aspnet_state.exe)
  2. 修改 mode="StateServer"
  3. 可跨服務器:stateConnectionString="tcpip=192.168.0.2:42424"(需目標機安裝 .NET Framework 並啟動該服務)
  • Session 存儲於獨立進程,IIS 重啟不丟失
  • 支持 Web 陣列/負載均衡場景
  • 性能略低於 InProc,但可接受

模式三:SQL Server(持久化,最高可靠性)

  1. 啟動 SQL Server 與 SQL Server Agent 服務
  2. 執行腳本:[系統盤]\WINNT\Microsoft.NET\Framework\[版本]\InstallSqlState.sql
    → 生成 ASPState 數據庫(僅存儲過程),實際 Session 寫入 tempdb.dbo.ASPStateTempSessions,Application 寫入 ASPStateTempApplications
  3. Agent 作業 ASPState_Job_DeleteExpiredSessions 每分鐘清理過期 Session
  4. 修改 mode="SQLServer",配置 sqlConnectionString="data source=localhost;Integrated Security=SSPI;"
    (推薦 Windows 集成認證,避免明文 sa 密碼)
  • Session 持久化到磁盤,重啟服務器甚至重裝 OS 也不丟失
  • 適合高可靠性、跨數據中心、長期 Session 需求
  • 性能最低(網絡 + 磁盤 I/O),但可通過優化連接池緩解

三大模式決策表

維度InProcStateServerSQL Server
性能⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
可靠性⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
Web 陣列支持❌✅✅
部署複雜度零配置啟動服務執行腳本+配置
適用場景單機、低併發、容許丟失Web 陣列、中等可靠性金融、醫療、跨機房、長期 Session

最佳實踐建議

  • 開發/測試環境:InProc(零維護)
  • 生產單機/小集群:StateServer(平衡性能與可靠)
  • 企業級/高可用/跨機房:SQL Server(數據不丟失)
  • 無論哪種模式,timeout 建議 20–30 分鐘,避免內存/數據庫膨脹
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved