服務熱線
153 8323 9821
一、會話狀態的功能
HTTP 是一個無狀態的協議,所以它不自動指示一個請求序列是否都來自相同的客戶端,甚至不指示單個瀏覽器實例是否仍活躍地查看某個頁或站點。而使用ASP.NET內置的會話狀態功能,可以使用我們做到
1、對從單個瀏覽器客戶端到服務器上邏輯應用程序會話的請求進行自動識別和分類。
2、將會話范圍的數據存儲在服務器上以供跨多個瀏覽器請求使用。
3、引發適當的可在應用程序代碼中處理的會話生存期管理事件(Session_OnStart、Session_OnEnd 等)
二、會話狀態的標識
在創建會話時,服務器會為每一個會話生成一個單獨的標識。該標識用 120 位的 SessionID 字符串表示,該字符串只包含 URL 中所允許使用的 ASCII 字符。SessionID 值是使用保證唯一性和隨機性的算法生成的,其中保證唯一性的目的是確保會話不沖突,保證隨機性的目的是確保懷有惡意的用戶不能使用新的 SessionID 來計算現有會話的 SessionID。
三、會話狀態的存儲方式
會話狀態有三種存儲方式
1、進程內會話狀態模式(Inproc):當我們新建一個WEB程序后默認的采用的進程內會話狀態模式,這也是大家所普遍采用的模式。在這種模式下會話狀態存儲在本地的 ASP.NET 輔助進程中,可以說到目前為止,進程內會話狀態模式可能是最快的訪問選項。但會話中存儲的數據越多,Web 服務器所消耗的內存就越多,這樣會潛在地增加性能降低的風險。
2、.NET 狀態服務器模式(StateServer):會話狀態存儲在遠程進程中(例如,名為 aspnet_state.exe的 indows NT 服務中)
3、SQL 模式(SQLServer):會話狀態存儲到由 SQL Server 管理的專用數據庫表中。
.NET 狀態服務器模式和SQL 模式都可以稱為進程外會話模式,當儲存數據時,需要將數據序列化儲存到外部儲備庫,當讀取和數據時,需要將數據反序列化,復制到本地會話詞典中,所以請求導致性能下降了 15%(進程外)到 25% (SQL Server)。注意這只是一種粗略的估計。但是在進程外存儲方案中,會話狀態存活的時間較長,使應用程序的功能更強大,因為它可以防止 Microsoft? Internet 信息服務 (IIS) 和ASP.NET 失敗。通過將會話狀態與應用程序相分離,您還可以更容易地將現有應用程序擴展到 Web Farm 和 Web Garden 體系結構中。另外,會話狀態存儲在外部進程中,從根本上消除了由于進程循環而導致的周期性數據丟失的風險。
四、會話狀態的配置
會話狀態的配置是通過設置Web.config文件的<sessionState>節來實現的。下面介紹一下三種會話狀態的具體配置方法
1、進程內模式
進程內模式是默認的會話狀態模式。若要使用進程內模式,請將 <sessionState> 元素的 mode 屬性設置為 Inproc。
下面顯示了進程內模式的一個配置設置示例。