ASP.NET的Session State
為此ASP 的使用者不得不自己手工將會(huì)話信息以會(huì)話 ID 為主鍵同步到外部數(shù)據(jù)庫中,以緩解類似問題。
而在 ASP.NET 中,因?yàn)樵O(shè)計(jì)時(shí)就考慮了這些問題,能夠避免這些限制:1.支持進(jìn)程外的狀態(tài)管理,通過獨(dú)立狀態(tài)管理服務(wù)或 SQL Server 狀態(tài)服務(wù)器管理會(huì)話狀態(tài)2.支持不使用 Cookie 的狀態(tài)維護(hù),通過在 URL 中自動(dòng)增加會(huì)話 ID 來避免使用 Cookie 3.通過獨(dú)立的狀態(tài)管理服務(wù)或SQL Server 狀態(tài)服務(wù)器支持負(fù)載均衡時(shí)同步使用會(huì)話信息實(shí)現(xiàn)這些特性的正是上節(jié)提到的Session StateModule.InitModuleFromConfig 函數(shù)中,根據(jù)Session State 標(biāo)記的 mode 屬性選擇的四種不同的狀態(tài)管理器實(shí)現(xiàn)。
以下內(nèi)容為程序代碼:
- <system.web>
- <sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424"
stateNetworkTimeout="10" sqlConnectionString="data source=127.0.0.1;- Integrated Security=SSPI" cookieless="false" timeout="20" />
- </system.web>
Off模式禁止會(huì)話管理,同時(shí) ASP.NET 還允許通過在頁面中以 Enable Session State 屬性細(xì)粒度管理頁面的會(huì)話支持狀態(tài)以下內(nèi)容為程序代碼:
- <%@ Page EnableSessionState=" True|False|ReadOnly" %>
InProc 模式兼容以前 ASP 的策略,在 ASP.NET 同一進(jìn)程空間內(nèi)實(shí)現(xiàn)基于內(nèi)存的會(huì)話狀態(tài)管理,速度最快但受到與 ASP 相同的限制;STATE SERVER 模式通過 ASP.NET 獨(dú)立安裝的 ASP.NET State Service 服務(wù)(aspnet_state.exe),以 stateConnectionString 指定的IP和端口響應(yīng)會(huì)話狀態(tài)服務(wù);SQLServer 模式則通過 sqlConnectionString 指定的 SQL Server 服務(wù)器,以內(nèi)存臨時(shí)表(以 InstallSqlState.sql建庫,使用 tempdb 內(nèi)存數(shù)據(jù)庫)或獨(dú)立表(以InstallPersistSqlState.sql 監(jiān)控,使用獨(dú)立的 ASPState 庫)維護(hù)會(huì)話狀態(tài)。
這四種不同的狀態(tài)管理器,在性能上據(jù)《Performance Tuning and Optimizing ASP.NET Appliation》一書的測試,相對(duì)值如下:以下為引用:Table 4-1: Normalized TTLB(Time to Last Byte) bySession State Mode (in Milliseconds per 100 Requests)
CONCURRENT BROWSERS MODE = OFF MODE = INPROC MODE = STATE SERVER MODE = SQLSERVER 1 7.81 4.54 8.27 8.47 5 28.28 20.25 27.25 29.29 10 89.38 46.08 77.29 85.11 Table 4-2: Average Requests per Second bySession State Mode CONCURRENT BROWSERS MODE = OFF MODE = INPROC MODE = STATE SERVER MODE = SQLSERVER 1 18.86 24.17 18.31 18.11 5 21.66 25.74 21.54 21.34 10 17.23 23.8 18.11 17.6可以看到,無論是從 TTLB 還是每秒平均請(qǐng)求數(shù)來說,進(jìn)程外狀態(tài)管理器的性能都是可以令人接受的,當(dāng)然還需要針對(duì)狀態(tài)管理情況在編寫代碼時(shí)做相關(guān)優(yōu)化。不過要使用進(jìn)程外狀態(tài)管理器,則保存在會(huì)話中的對(duì)象受到必須提高二進(jìn)制序列化支持的限制。
從使用角度來看,狀態(tài)管理器實(shí)際上都是由上節(jié)提到的 HttpSessionModule 建立管理,并通過 Http Session State 接口提供訪問的,結(jié)構(gòu)如下圖:MSDN 上的 Underpinnings of theSession State Implementation in ASP.NET 一文非常詳細(xì)的解釋了幾種不同狀態(tài)管理器的原理和使用,這兒就不羅嗦了。
【編輯推薦】