自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

淺談ASP.NET狀態(tài)管理器

開發(fā) 后端
本文介紹ASP.NET狀態(tài)管理器,實(shí)現(xiàn)這些特性的正是上節(jié)提到的 SessionStateModule.InitModuleFromConfig 函數(shù)中,根據(jù) sessionState 標(biāo)記的 mode 屬性選擇的四種不同的ASP.NET狀態(tài)管理器實(shí)現(xiàn)。

狀態(tài)管理本來是一件很美好的事情,嘿嘿,只可惜總是有些廠商在實(shí)現(xiàn)的時(shí)候考慮得不那么周全。例如 MS 在 ASP狀態(tài)管理實(shí)現(xiàn)就比較爛,因?yàn)橹粚?shí)現(xiàn)了一個(gè)進(jìn)程內(nèi)的基于內(nèi)存的狀態(tài)管理,故而存在很多問題:
1.所有的 Session 數(shù)據(jù)都保存在 Web 服務(wù)的進(jìn)程中,會(huì)造成服務(wù)器支持會(huì)話數(shù)量受到服務(wù)器內(nèi)存資源的限制問題,同時(shí)也因?yàn)榇罅糠腔顒?dòng)會(huì)話導(dǎo)致內(nèi)存被無效占用。
2.服務(wù)器進(jìn)程崩潰會(huì)導(dǎo)致所有的會(huì)話數(shù)據(jù)丟失。
3.會(huì)話無法跨進(jìn)程或在負(fù)載均衡情況下使用,除非負(fù)載均衡技術(shù)保障同一用戶每次都能被路由到同一機(jī)器上。就算這樣也無法保障服務(wù)器崩潰造成的會(huì)話數(shù)據(jù)丟失。
4.需要 Cookie 的支持,而現(xiàn)在因?yàn)榘踩詥栴},很多人在瀏覽器中關(guān)閉了 Cookie 和 js 的支持。

為此 ASP 的使用者不得不自己手工將會(huì)話信息以會(huì)話 ID 為主鍵同步到外部數(shù)據(jù)庫(kù)中,以緩解類似問題。

而在 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é)提到的 SessionStateModule.InitModuleFromConfig 函數(shù)中,根據(jù) sessionState 標(biāo)記的 mode 屬性選擇的四種不同的ASP.NET狀態(tài)管理器實(shí)現(xiàn)。

  1. <system.web> 
  2. <sessionStatemodesessionStatemode="InProc" 
  3. stateConnectionString="tcpip=127.0.0.1:42424" 
  4. stateNetworkTimeout="10" 
  5. sqlConnectionString="datasource=127.0.0.1;IntegratedSecurity=SSPI" 
  6. cookieless="false" 
  7. timeout="20"/> 
  8. </system.web> 

ConfigInit 方法主要在初始化狀態(tài)管理器時(shí)通知其根據(jù)配置進(jìn)行初始化工作,并將負(fù)責(zé)會(huì)話狀態(tài)清除的 SessionOnEndTarget 對(duì)象實(shí)例綁定到會(huì)話管理器(我們后面討論會(huì)話狀態(tài)管理實(shí)現(xiàn)時(shí)詳細(xì)討論)。對(duì) OutOfProcStateClientManager 和 SqlStateClientManager 來說,在此階段還會(huì)初始化與外部服務(wù)器的連接,并通過一個(gè) System.Web.Util.ResourcePool 實(shí)例,提供基于時(shí)間策略的資源池來維護(hù)連接;

ResetTimeout 方法重置指定 Session 的超時(shí)時(shí)間;對(duì) InProcStateClientManager 來說,這個(gè)超時(shí)時(shí)間是通過 System.Web.Caching.CacheInternal 類型實(shí)現(xiàn)的緩存對(duì)象來使用的; OutOfProcStateClientManager 直接通過 MakeRequest 函數(shù)構(gòu)造請(qǐng)求發(fā)給外部獨(dú)立的狀態(tài)管理器執(zhí)行; SqlStateClientManager 則調(diào)用存儲(chǔ)過程 TempResetTimeout 更新 ASPStateTempSessions 表的過期時(shí)間 Expires 字段;

Dispose 方法是否狀態(tài)管理器的資源,落實(shí)到代碼就是對(duì) OutOfProcStateClientManager 和 SqlStateClientManager 中資源池的釋放;

Set 方法則將指定的 SessionStateItem 存儲(chǔ)到 id 相關(guān)的會(huì)話數(shù)據(jù)中,并根據(jù) inStorage 指定的對(duì)象狀態(tài),決定在發(fā)生異常的情況下是否釋放對(duì)此會(huì)話的鎖。與 ResetTimeout 的實(shí)現(xiàn)類似,OutOfProcStateClientManager 發(fā)送請(qǐng)求給外部獨(dú)立的狀態(tài)管理器;SqlStateClientManager 調(diào)用存儲(chǔ)過程 TempUpdateStateItemXXX 更新會(huì)話狀態(tài)表 ASPStateTempSessions 中的過期時(shí)間 Expires 字段、鎖定狀態(tài) Lock 字段、以及狀態(tài)信息 SessionItemShort/SessionItemLong (分別保存 7000字節(jié)以下或之上的數(shù)據(jù))。如發(fā)生異常并設(shè)置 inStorage 標(biāo)記,則先調(diào)用 TempReleaseStateItemExclusive 釋放會(huì)話鎖。

對(duì)ASP.NET狀態(tài)管理器中數(shù)據(jù)的獲取較為復(fù)雜,IStateClientManager 接口使用的是異步調(diào)用的模式,并為提高效率將獨(dú)占的獲取數(shù)據(jù)單獨(dú)拿出來。狀態(tài)管理器實(shí)現(xiàn)類通過通用基類 System.Web.SessionState.StateClientManager 實(shí)現(xiàn)的幾個(gè)工具方法,將數(shù)據(jù)獲取操作異步化。再最終由實(shí)現(xiàn)類通過 Get 和 GetExclusive 方法完成操作。獲取數(shù)據(jù)的方法 InProcStateClientManager 通過緩存;OutOfProcStateClientManager 通過請(qǐng)求;SqlStateClientManager 通過 TempGetStateItemXXX 存儲(chǔ)過程完成。

【編輯推薦】

  1. ASP.NET開發(fā)技巧之Theme功能淺析
  2. 詳解ASP.NET動(dòng)態(tài)編譯
  3. Apache支持ASP.NET方法淺析
  4. 淺談ASP.NET服務(wù)器標(biāo)準(zhǔn)控件
  5. ASP.NET中SQL Server數(shù)據(jù)庫(kù)備份恢復(fù)淺析
責(zé)任編輯:佚名 來源: 51CTO.COM
相關(guān)推薦

2009-07-28 16:03:23

ASP.NET狀態(tài)服務(wù)

2009-08-05 17:39:13

ASP.NET常用狀態(tài)

2009-07-24 10:52:42

ASP.NET ISA

2009-08-04 14:36:00

ASP.NET分頁管理

2009-07-22 16:11:43

ASP.NET AJA

2009-07-20 15:30:11

ASP.NET應(yīng)用

2009-08-05 15:29:33

ASP.NET For

2009-07-23 15:44:39

ASP.NET MVC

2009-07-28 17:49:30

ASP.NET定期回收

2009-07-22 13:24:24

ASP.NET MVC

2009-08-10 10:19:47

ASP.NET組件設(shè)計(jì)

2009-07-20 17:12:17

ASP.NET訪問數(shù)據(jù)

2009-07-23 15:24:37

ASP.NET Ima

2011-08-23 10:58:59

2009-07-21 14:16:02

ASP.NET管道優(yōu)化

2009-07-27 16:19:59

ASP.NET報(bào)表控件

2009-07-28 10:43:23

Web服務(wù)器ASP.NET

2009-08-04 17:18:37

2009-07-28 11:09:02

ASP.NET狀態(tài)類型

2009-07-28 17:34:28

ASP.NET XML
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)