ASP.NET Session【會話狀態】

ASP.NET 會話狀態

  ASP.NET默認情況下將會話信息存儲在ASP.NET應用程序的內存空間【InPro】,存放在InPro中時,可能會出現會話信息丟失的情況,所以可以使用一個獨立的服務存儲會話信息以便重新啓動ASP.NET應用程序後會話信息依然保留,將會話信息存儲在StateServerSQLServer中以便會話信息可供網絡場中的多個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事件將不受支持

會話模式

  1. InProc模式,此模式將會話狀態存儲在Web服務器上的內存中。默認值
  2. StateServer模式,此模式將會話狀態存儲在一個名爲ASP.NET State Service的單獨進程中。這確保了在重新啓動Web應用程序是會保留會話狀態,並讓會話狀態可用於網絡場中的多個Web服務器
  3. SQL Server模式將會話狀態存儲到一個SQL Server數據庫中
  4. Custom模式,此模式允許你指定自定義存儲提供程序
  5. 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>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章