asp.net SessionState模式的配置及使用

  因爲項目dll文件變更比較頻繁,而保存登錄的狀態又保存在Session中,因此致使用戶常常無端掉線(PS:dll變更的時候致使Session)。有一種方法能夠長期保存session,那就是session的SqlServer模式。仍是先介紹一下session的四種模式吧:web

  ASP.NET會話狀態模塊在Web.config文件中<System.web>標記下的<Sessionstate>標記的mode屬性來決定該屬性的四種可能的值: Off、Inproc、StateServer 和SQLserver。sql

  ①.Inproc是缺省的設置數據庫

  它容許「無Cookie」的會話,以及在服務器以外存儲會話數據。ASP.NET會話狀態模塊在Web.config文件中像下面這樣配置:<sessionState mode="InProc" cookieless="false" timeout="20" />在這個例子中,mode屬性設爲InProc(默認值),代表會話狀態要由ASP.NET存儲到內存中,並且不用Cookie來傳遞會話ID。安全

  相反,會話ID要直接插入一個網頁URL的查詢字符串中。例如,採用InProc模式並創建一個會話以後,調用一個假想的ASP.NET網頁時,須要採用下面這樣的URL:http://my.website.com/(12mfju55vgblubjlwsi4dgjq)/education.aspx圓括號中長長的字母、數字字符串就是會話ID。        服務器

   ASP.NET引擎從查詢字符中提取會話ID,並將用戶請求與特定會話聯繫起來。採起這種方式,無論Cookie仍是隱藏表單字段都用不着了。因此,即便網頁中沒有使用表單,也能加入會話。可是這種方法,應用程序的狀態將依賴於 ASP.NET進程, 當IIS進程崩潰或者正常重啓時,保存在進程中的狀態將丟失。cookie

  ②.mode屬性設爲Offsession

  和從前的ASP同樣,ASP.NET的會話狀態管理是要產生開銷的。因此,假如某個網頁不須要訪問Session對象,開發者應將那個頁的Page預編譯指令的EnableSessionState屬性設爲False。要爲整個網站禁用會話狀態,可在Web.config文件中將sessionState元素的mode屬性設爲Off。   爲了克服inproc 模式的缺點, ASP.NET 提供了兩種進程外保存會話狀態的方法(③和④)。less

  ③.StateServer會話管理tcp

  將mode屬性設爲StateServer,也就是將會話數據存儲到單獨的內存緩衝區中,再由單獨一臺機器上運行的Windows服務來控制這個緩衝區。狀態服務全稱是「ASP.NET State Service 」(aspnet_state.exe),它由Web.config文件中stateConnectionString屬性來配置。該屬性指定了服務所在的服務器,以及要監視的端口:<sessionState mode="StateServer"   stateConnectionString="tcpip=myserver:42424"    cookieless="false" timeout="20" />。 在這個例子中,狀態服務在一臺名爲myserver的機器的42424端口(默認端口)運行。要在服務器上改變端口,可編輯HKLM\SYSTEM\CurrentControlSet\Services\aspnet_state註冊表項中的Port值。顯然,使用狀態服務的優勢在於進程隔離,並可在Web farm中共享。 使用這種模式,會話狀態的存儲將不依賴於iis進程的失敗或者重啓,然而,一旦狀態服務停止,全部會話數據都會丟失。換言之,狀態服務不像SQL Server那樣能持久存儲數據;它只是將數據存儲在內存中。網站

  ④.用SQL Server進行會話管理 (重點講解

   ASP.NET還容許將會話數據存儲到一個數據庫服務器中,方法是將mode屬性變成SqlServer。 在這種狀況下,ASP.NET嘗試將會話數據存儲到由sqlConnectionString屬性(其中包含數據源以及登陸服務器所需的安全憑證)指定的SQL Server中。

 

配置用SQL Server進行會話管理 

  具體配置以下:

  ①、運行Framewor安裝目錄下的InstallSqlState.sql文件,framework的安裝目錄爲C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319 

  ②、這時會提示錯誤,由於該應用沒有註冊。此時須要在命令行下注冊該應用,運行以下命令:

  aspnet_regsql.exe  -ssadd -sstype c -d <Database Name> -S <SQL Server IP> -U <User Name> -P <Password> 

  注:<Database Name>爲數據庫名爲ASPState ,<SQL Server IP>爲數據庫實例名像 IBM-PC\SQLEXPRESS  (若數據庫不是2005的不要寫ip地址,不然會鏈接失敗),<User Name>爲sa(或與sa同等權限的),<Password> 爲 sa用戶名的密碼會話定義成功,可是會提示在web應用中進行相應的配置,此時查看SQLServer會發現增長了數據庫ASPState,可是沒有表。

  ③、在命令行下運行以下命令:aspnet_regsql.exe  -ssadd -sstype p -S <SQL Server IP> -U <User Name> -P <Password>

  該命令對此應用進行了持久化操做。這時會看到ASPState數據庫裏面多了兩張表,ASPStateTempSession就能夠用來保存Session。應用時,須要在webconfig中添加以下配置:

  配置節點爲:<sessionState mode="SQLServer"  sqlConnectionString="server=<Server IP>;database=<Database Name>;uid=<User Name>;pwd=<Password>;"cookieless="false" timeout="20" />以下:

  雖然timeout設置的是20分鐘可是 過時之後仍然能夠獲取到session的值。

相關文章
相關標籤/搜索