溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ASP.NET中怎么實現(xiàn)一個狀態(tài)管理器

發(fā)布時間:2021-07-15 15:37:11 來源:億速云 閱讀:129 作者:Leah 欄目:編程語言

這篇文章將為大家詳細講解有關(guān)ASP.NET中怎么實現(xiàn)一個狀態(tài)管理器,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。


1.所有的 Session 數(shù)據(jù)都保存在 Web 服務的進程中,會造成服務器支持會話數(shù)量受到服務器內(nèi)存資源的限制問題,同時也因為大量非活動會話導致內(nèi)存被無效占用。
2.服務器進程崩潰會導致所有的會話數(shù)據(jù)丟失。
3.會話無法跨進程或在負載均衡情況下使用,除非負載均衡技術(shù)保障同一用戶每次都能被路由到同一機器上。就算這樣也無法保障服務器崩潰造成的會話數(shù)據(jù)丟失。
4.需要 Cookie 的支持,而現(xiàn)在因為安全性問題,很多人在瀏覽器中關(guān)閉了 Cookie 和 js 的支持。

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

而在 ASP.NET 中,因為設(shè)計時就考慮了這些問題,能夠避免這些限制:
1.支持進程外的狀態(tài)管理,通過獨立狀態(tài)管理服務或 SQL Server 狀態(tài)服務器管理會話狀態(tài)
2.支持不使用 Cookie 的狀態(tài)維護,通過在 URL 中自動增加會話 ID 來避免使用 Cookie
3.通過獨立的狀態(tài)管理服務或SQL Server 狀態(tài)服務器支持負載均衡時同步使用會話信息

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

<system.web> <sessionStatemodesessionStatemode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" stateNetworkTimeout="10" sqlConnectionString="datasource=127.0.0.1;IntegratedSecurity=SSPI" cookieless="false" timeout="20"/> </system.web>

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

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

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

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

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

關(guān)于ASP.NET中怎么實現(xiàn)一個狀態(tài)管理器就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI