ASP.NET 會話狀態
ASP.NET默認情況下將會話信息存儲在ASP.NET應用程序的內存空間【InPro】,存放在InPro中時,可能會出現會話信息丟失的情況,所以可以使用一個獨立的服務存儲會話信息以便重新啓動ASP.NET應用程序後會話信息依然保留,將會話信息存儲在StateServer或SQLServer中以便會話信息可供網絡場中的多個Web服務器使用【重新啓動ASP.NET應用程序後會話信息會保留】,或將會話信息存儲在自定義數據存儲區。
會話標識符
會話由一個可以使用SessionID屬性讀取的唯一會話標識符標識,爲ASP.NET應用程序啓用會話狀態時,將檢查應用程序中每個頁面請求是否有瀏覽器發送的SessionID值,如果未提供任何SessionID值,則ASP.NET啓動一個新會話,然後將該會話的SessionID隨響應一起發送到瀏覽器
默認情況下,SessionID值存儲在Cookie中,但也可以通過配置應用程序【在Web.config文件的SessionState節中將CookieLess屬性設置爲True】,將SessionID值存儲在URL中。只要一直使用相同的SessionID值來發送請求,會話就被視爲活動的,如果特定會話的請求發送時間超過指定的超時值,則該會話被視爲過期,使用過期的SessionID值來發送請求將啓動新會話。示意圖:
注意:爲提高應用程序的安全性,當用戶從應用程序註銷時,此時應用程序應當調用Abandon方法銷燬Session。當在Web.config文件中進行如下配置時:
<sessionState mode="StateServer" cookieless="UseUri"></sessionState>
ASP.NET自動在頁的URL中插入唯一的會話ID來保持無Cookie會話狀態,如下所示:
將SessionState配置元素的regenerateExpiredSessionId屬性設置爲true,這樣,在使用已過期的會話ID發起無Cookie會話請求時,將生成一個新的會話ID。
會話事件
ASP.NET提供兩個管理用戶會話的事件:Session_OnStart和Session_OnEnd,如果將Mode設置爲InProc以外的值,Session_OnEnd事件將不受支持
會話模式
- InProc模式,此模式將會話狀態存儲在Web服務器上的內存中。默認值
- StateServer模式,此模式將會話狀態存儲在一個名爲ASP.NET State Service的單獨進程中。這確保了在重新啓動Web應用程序是會保留會話狀態,並讓會話狀態可用於網絡場中的多個Web服務器
- SQL Server模式將會話狀態存儲到一個SQL Server數據庫中
- Custom模式,此模式允許你指定自定義存儲提供程序
- Off模式,此模式禁用會話狀態
InProc模式
進程內模式是默認的會話狀態模式,使用 InProc SessionStateMode 枚舉值指定。進程內模式將會話狀態值和變量存儲在本地 Web 服務器上的內存中。它是唯一支持 Session_OnEnd 事件的模式。
StateServer模式
StateServer模式將會話狀態存儲在一個稱爲ASP.NET狀態服務【ASP.NET State Service】的進程中,該進程獨立於ASP.NET輔助進程或IIS的單獨進程。使用此模式可以確保在重新啓動Web應用程序是保留會話狀態,並使會話狀態可用於網絡場中的多個Web服務器。
若要將某個ASP.NET應用程序配置爲使用StateServer模式,在Web.Config文件中將SessionState元素的Mode屬性設置爲StateServer,將stateConnectionString屬性設置爲tcpip=服務器名稱:42424
<sessionState mode="StateServer" cookieless="UseUri" stateConnectionString="tcpip=118.114.21.5:42424" timeout="20"></sessionState>
運行程序出現如下錯誤:
解決方法:開啓ASP.NET State Service:
更改註冊表AllowRemoteConnection爲1:
備註:如果Mode取值爲StateServer或SQLServer,則存儲在會話狀態中的對象必須可序列化
SQL Server模式
SQLServer模式將會話狀態存儲到一個SQL Server數據庫中,使用此模式可以確保在重新啓動Web應用程序是保留會話狀態,並使會話狀態可用於網絡場中的多個Web服務器。
若要使某個ASP.NET應用程序配置爲使用SQL Server模式,將mode屬性設置爲SQLServer,將sqlConnectionString屬性設置爲SQL Server數據庫的連接字符串,並且必須安裝ASP.NET會話數據庫,可以通過利用Aspnet_regsql.exe進行安裝,Aspnet_regesql.exe路徑:C:\Windows\Microsoft.NET\Framework\v4.0.30319,運行Aspnet_regesql.exe安裝SQLServer會話數據庫:
Web.config配置:
<sessionState mode="SQLServer" cookieless="UseUri" sqlConnectionString="Data Source=LBWIN7;Initial Catalog=aspnetdb;Integrated Security=True" timeout="20"></sessionState>
SessionState配置詳解
<sessionState mode="[Off|InProc|StateServer|SQLServer|Custom]" timeout="number of minutes" cookieName="session identifier cookie name" cookieless="[true|false|AutoDetect|UseCookies|UseUri|UseDeviceProfile]" regenerateExpiredSessionId="[True|False]" sqlConnectionString="sql connection string" sqlCommandTimeout="number of seconds" allowCustomSqlDatabase="[True|False]" useHostingIdentity="[True|False]" stateConnectionString="tcpip=server:port" stateNetworkTimeout="number of seconds" customProvider="custom provider name"> <providers>...</providers> </sessionState>
默認配置:
<sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" stateNetworkTimeout="10" sqlConnectionString="data source=127.0.0.1;Integrated Security=SSPI" sqlCommandTimeout="30" customProvider="" cookieless="UseCookies" cookieName="ASP.NET_SessionId" timeout="20" allowCustomSqlDatabase="false" regenerateExpiredSessionId="true" partitionResolverType="" useHostingIdentity="true"> <providers> <clear /> </providers> </sessionState>