http://www.cnblogs.com/libingql/p/4675752.html
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狀態的對象需要進行序列化和反序列化,以便通過網絡傳給數據庫服務器,以及從數據庫服務器傳回。