1. sessionState的4種mode模式
在ASP.NET中Session的sessionState的4中mode模式:Off、InProc、StateServer及SqlServer。
2. Off模式
<sessionState mode="Off"></sessionState>
關閉模式,即不需要使用Session。
單個頁面關閉Session:
<%@ Page EnableSessionState="false" %>
3. InProc模式(預設模式)
<sessionState mode="InProc" cookieless="false" timeout="20"></sessionState>
mode設定為"InProc"時,Session直接儲存在IIS程式中。
優點:獲取session狀態的速度快
缺點:易丟失
mode為InProc可能造成Session丟失的情況:
1>. ASP.NET程式(aspnet_wp.exe)、IIS程式(w3wp.exe)預設的20分鐘重啟應用程式;
2>. 緩衝池填滿後重啟;
3>. 程式保護措施重啟。
4. 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 (埠號)
5. 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狀態的物件需要進行序列化和反序列化,以便通過網路傳給資料庫伺服器,以及從資料庫伺服器傳回。