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中。
在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相同權限的用戶。
執行成功後,會發現多了兩個表和一些存儲過程:
最後修改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。