1. 程式人生 > >ASP.NET程式中Session儲存的幾種模式

ASP.NET程式中Session儲存的幾種模式

 ASP.NET程式中Session的sessionState的四種mode模式:Off、InProc、StateServer、SqlServer。

mode

可選的 SessionStateMode 屬性。

指定儲存會話狀態值的位置。有關更多資訊,請參見會話狀態模式

mode 屬性可以為下列可能值之一。預設值為 InProc

 

說明

Custom

會話狀態將使用自定義資料儲存區來儲存會話狀態資訊。

InProc

會話處於正在處理 ASP.NET 輔助程序的狀態。

Off

會話狀態被禁用。

SQLServer

會話狀態將使用程序外 SQL Server 資料庫來儲存狀態資訊。

StateServer

會話狀態將使用程序外 ASP.NET 狀態服務來儲存狀態資訊。

一、 Off模式

<sessionState mode="Off"></sessionState>

關閉模式,即不需要使用Session。單個頁面關閉Session,可以在頁面中

<%@ Page EnableSessionState="false" %>

二、 InProc模式(預設模式)

<sessionState mode="InProc" cookieless="false" timeout="20"></sessionState>

  mode設定為"InProc"時,Session直接儲存在IIS程序中。預設超時時間20分鐘。

  優點:獲取session狀態的速度快

  缺點:易丟失

  mode為InProc可能造成Session丟失的情況:

  1、 ASP.NET程序(aspnet_wp.exe)、IIS程序(w3wp.exe)預設的20分鐘重啟應用程式。

  2、 緩衝池填滿後重啟。

  3、 程序保護措施重啟。

三、StateServer模式

  mode設定為"StateServer"時,Session 儲存在單獨的記憶體緩衝區中,再由單獨一臺伺服器上執行的ASP.NET State Service(aspnet_state.exe)來控制這個緩衝區。

  優點:session狀態單獨儲存在一個程序中,不會因為iis或者應用的重啟而丟失狀態。

  缺點:

  1、由於是兩個不同的程序,獲取Session資料比InProc慢;

  2、Session資料儲存在記憶體中,重啟ASP.NET State Service服務,Session資料將丟失。

<sessionState mode="StateServer" stateConnectionString="tcpip=tcpip=127.0.0.1:42424" cookieless="false" timeout="20"></sessionState>

  以上設定的ASP.NET State Service在127.0.0.1的42424埠(預設埠)上執行,要在伺服器上改變埠,可編輯HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters登錄檔項中的Port值。(開啟登錄檔方式:執行 regedit)

  mode設定為"StateServer"需要注意:

  1、啟動ASP.NET State Service;

  2、如果stateConnectionString的值不是127.0.0.1或者localhost等代表本地地址的值,需要修改登錄檔:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state \Parameters 節點 → 將 AllowRemoteConnection 的鍵值設定成“1”(1 為允許遠端電腦的連線,0 代表禁止)→ 設定 Port (埠號) 

四、 SqlServer模式

  mode設定為"SqlServer"時,Session儲存在SQL Server資料庫中持久化保持,ASP.NET嘗試將會話資料儲存到由sqlConnectionString屬性(其中包含資料來源以及登入伺服器所需的安全憑證)指定的SQL Server中。可應用場景:網路負載均衡(NLB)環境。

  設定SqlServer模式步驟:

  1、配置SQL erver建立ASPState資料庫

  建立ASPState資料庫,執行C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallSqlState.sql,可以通過SQL查詢分析器來執行語句,也可以使用sqlcmd來執行。

sqlcmd -S [server name] -U [user] -P [password] -i C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallSqlState.sql

  此時SQLServer會建立資料庫ASPState,但是沒有表。

  若建立ASPState資料庫後要刪除,可以執行C:\Windows\Microsoft.NET\Framework\v4.0.30319\UninstallSqlState.sql,但要先停止w3svc程序。

net stop w3svc

  2、ASPState建立表

aspnet_regsql.exe  -ssadd -sstype p -S [server name] -U [user] -P [password]

  執行cmd:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regsql.exe  -ssadd -sstype p -S (local) -U sa -P '1'

  此時資料庫中建立兩張表:ASPStateTempApplications、ASPStateTempSessions。

  3、設定sessionState

<sessionState mode="SQLServer" sqlConnectionString="data source=127.0.0.1;user id=sa;password=1" cookieless="false" timeout="20"></sessionState>

  由於資料不儲存在本地記憶體,儲存Session狀態的物件需要進行序列化和反序列化,以便通過網路傳給資料庫伺服器,以及從資料庫伺服器傳回。