淺談Asp.net的sessionState

淺談Asp.net的sessionState html


Three Session State providers :
web

  • InProcSessionStateStore, which stores session state in memory in the ASP.NET worker processsql

  • OutOfProcSessionStateStore, which stores session state in memory in an external state server process數據庫

  • SqlSessionStateStore, which stores session state in Microsoft SQL Server and Microsoft SQL Server Express databases安全


sessionState節點的配置服務器

web.config關於sessionState節點的配置方案,sessionState有四種模式:off,inProc,StateServer,SqlServer。cookie

 

一、off模式網絡

從字面上就能夠看出這個是關閉模式,若是當前頁面不須要session的值,爲了減小服務器資源,你能夠去掉Session的開銷。session

<sessionState mode="off">或者頁面上less

<%@ Page EnableSessionState="false" %>來關閉Session。

 

二、inProc模式(缺省模式)

它容許「無Cookie」的會話,以及在服務器以外存儲
會話數據。ASP.NET會話狀態模塊在Web.config文件中像下面這樣配置:

<sessionState mode="InProc" cookieless="false" timeout="20" />

在這個例子中,mode屬性設爲InProc(默認值),代表會話狀態要由ASP.NET存儲到內存中,並且
不用Cookie來傳遞會話ID。採起這種方式,無論Cookie仍是隱藏表單字段都用不着了。
因此,即便網頁中沒有使用表單,也能加入會話。 可是這種方法,應用程序的狀態將依賴於 ASP.NET進程, 當IIS進程崩潰或者正常重啓時,保存在
進程中的狀態將丟失。

 

三、StateServer會話管理mos

將mode屬性設爲StateServer,也就是將會話數據存儲到單獨的內存緩衝區中,再由單獨一臺機器上運行

的Windows服務來控制這個緩衝區。狀態服務全稱是「ASP.NET State Service 」(aspnet_state.exe),計算機管理-服務 裏面便可看到此服務,啓動該服務j

它由Web.config文件中的stateConnectionString屬性來配置。該屬性指定了服務所在的服務器,以及要監

視的端口:
<sessionState mode="StateServer"
    stateConnectionString="tcpip=myserver:42424"
    cookieless="false" timeout="20" />
  
在這個例子中,狀態服務在一臺名爲myserver的機器的42424端口(默認端口)運行。要在服務器上改變

端口,可編輯HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters註冊表項中的Port值。

顯然,使用狀態服務的優勢在於進程隔離,並可在Web farm(網站羣)中共享。 使用這種模式,會話狀態的存儲將不

依賴於iis進程的失敗或者重啓,然而,一旦狀態服務停止,全部會話數據都會丟失。換言之,狀態服務不

像SQL Server那樣能持久存儲數據;它只是將數據存儲在內存中。

 

4 用SQL Server進行會話管理

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

務器所需的安全憑證)指定的SQL Server中。

  1. VS命令行下執行命令:

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

注:在執行以上命令前,必須確保已經建立了數據庫<Database Name><User Name>必須是sa用戶或者具備sa相同權限的用戶。

 

執行成功後,會發現多了兩個表和一些存儲過程:

 


  1. 最後修改web.config裏面的sessionState節點爲:

<sessionState mode="SQLServer" allowCustomSqlDatabase="true" sqlConnectionString="server=99.1.57.140; database=CMBSITE_Session; uid=cmbpost;pwd=post@cmb;" cookieless="false" timeout="20"/>  

鏈接的數據庫,根據實際狀況來配置。

卸載這些表和存儲過程,可使用UninstallSqlState.sql腳本,使用方法與上面相似。

 

配置好SQL Server後,應用程序代碼運行時就和InProc模式沒有什麼區別。但要注意的是,因爲數據不存儲在本地內存,因此存儲會話狀態的對象須要進行序列化和反序列化,以便經過網絡傳給數據庫服務器,以及從數據庫服務器傳回。這固然會影響性能。經過在數據庫中存儲會話狀態,可分別針對擴展性及可靠性來有效地平衡性能。另外,能夠利用SQL Server的集羣,使狀態存儲不依賴於單個的SQL Server, 這樣就能夠爲應用程序提供極大限度的可靠性。


ASP.NET 狀態數據庫FAQ1.若是把SESSION值存放到數據庫中去,用戶關閉了程序那怎麼樣清空數據庫裏的SESSION值呢?實際ASP.NET在建立狀態數據庫的時候會在SQL Server代理(SQL Server Agent)的做業中添加一個做業,名稱爲<狀態數據庫名>_Job_DeleteExpiredSessions。若是打開SQL Server代理服務數據庫能夠經過添加的狀態記錄的超時時間字段(Exprires)按期對超時的狀態數據進行刪除。2.ASPStateTempSessions表中的SessionId字段如何使用?數據庫中此表的SessionID字段的值,由SessionID和AppID共同組成,最後8位爲AppID因此,後8位以前必定是SessionID。例如,存儲在數據庫中的值爲"ekr30c3mwvnc3145yrswew3a037e5e5a",後8位的"037e5e5a"爲AppID,而前面的"ekr30c3mwvnc3145yrswew3a"爲應用程序中你可使用Session.SessionID得到的字符串。3.如何判斷Session什麼時候被更新的?Session記錄被更新時會同時更新Expires和LockDateLocal,Expires字段爲UTC時間,若是想經過本地之間進行比較判斷仍是須要使用LockDateLocal。

相關文章
相關標籤/搜索