HTTP 是一種無狀態協議。這意味着 Web 服務器會將針對頁面的每一個 HTTP 請求做爲獨立的請求進行處理。ASP.NET 會話狀態未來自限定時間範圍內的同一瀏覽器的請求標識爲一個會話,並提供用於在該會話持續期間內保留變量值的方法。默認狀況下,將爲全部 ASP.NET 應用程序啓用 ASP.NET 會話狀態。當用戶在 Web 應用程序中導航 ASP.NET 頁時,ASP.NET 會話狀態使您可以存儲和檢索用戶的值。 web
在閱讀完MSDN的文檔後我的對會話狀態的關注點有標識符,模式還有事件。 數據庫
Session標識符 瀏覽器
Seesion在鄙人大學時學習ASP.NET WebForm的時候就接觸到,當時是以Page類的內置對象來介紹。當時結合這裏的理解,Session對象其實是用於保存一個會話中所須要保留下來的值的一個字典集合。而在服務器中接受了多個用戶的訪問請求後,會產生多個會話,這些會話對應的Session也是以一個字典集的形式保存起來。Session內的值對應的標識符是由開發人員本身定義,而每一個Session對象的標識符是由一個SessionIDManager來提供,這個SessionIDManager能夠開發本身定義。服務器每次接受到一個請求時,都會檢查這個請求中是否帶了會話的標識符,默認是存儲在cookie中的ASP.NET_SessionId,若是沒有則經過SessionIDManager的CreateSessionID方法建立一個,而後響應的時候把這個SessionIDManager告訴瀏覽器,那麼之後每次發請求的時候都會帶着這個ASP.NET_SessionId的Cookie發到服務端,代表這一系列的請求都屬於一個會話。 服務器
當在 Web.config 文件的 sessionState 節中將 cookieless 屬性設置爲 TRUE或UseUri,能夠指定不將會話標識符存儲在 cookie 中。ASP.NET 經過自動在頁的 URL 中插入惟一的會話 ID 來保持無 cookie 會話狀態。例如,下面的 URL 已被 ASP.NET 修改,以包含惟一的會話 ID lit3py55t21z5v55vlm25s55: cookie
但凡使用了這種形式的Session配置時,在將每頁發送到瀏覽器以前,在連接中嵌入一個會話 ID 值。只要用戶遵循 ASP.NET 應用程序提供的連接路徑,便可保持會話狀態,不然像平時的把請求重定向或者或者跳轉到某個URL時, 網絡
如上面所示因缺少SessionId而使得服務器斷定爲一個新的會話,最終致使丟失了以前會話的狀態。 session
默認狀況下會回收無 cookie 會話中使用的會話 ID 值。即若是使用已過時的會話 ID 發起一個請求,將使用此請求提供的 SessionID 啓動一個新的會話。將 sessionState 配置元素的 regenerateExpiredSessionId 屬性設置爲 true。這樣,在使用已過時的會話 ID 發起無 cookie 會話請求時,將生成一個新的會話 ID。若是使用 HTTP POST 方法發起使用已過時會話 ID 的請求,則當 regenerateExpiredSessionId 爲 true 時,將丟失發送的全部數據,由於 ASP.NET 會執行重定向,以確保瀏覽器在 URL 中具備新的會話標識符。但對於如今的Web系統而言會話過時都會致使請求時認證失敗,重定向到登陸頁面,此時確定會丟失全部提交的數據。 less
Session模式 tcp
ASP.NET 會話狀態支持若干用於會話數據的存儲選項。其經過web.config/sessionState中的mode屬性設置,包含InProc(進程內),StateServer(狀態服務器),SQLServer(SQL Server數據庫模式),Custom(自定義模式),Off(禁用) ide
進程內模式:進程內模式是默認的會話狀態模式,進程內模式將會話狀態值和變量存儲在本地 Web 服務器上的內存中。我的估計它是存儲在工做進程(w3wp.exe)內。它是惟一支持 Session_OnEnd 事件的模式。
1.狀態服務器模式:StateServer 模式將會話狀態存儲在一個稱爲 ASP.NET 狀態服務的進程中,該進程是獨立於 ASP.NET 輔助進程或 IIS 應用程序池的單獨進程。使用此模式能夠確保在從新啓動 Web 應用程序時保留會話狀態,並使會話狀態可用於網絡場中的多個 Web 服務器。
若要使用 StateServer 模式,必須首先確保 ASP.NET 狀態服務運行在用於存儲會話的服務器上。ASP.NET 狀態服務在安裝 ASP.NET 和 .NET Framework 時做爲一個服務進行安裝。ASP.NET 狀態服務安裝在如下位置:
好比我係統的.NET Framework4的狀態服務在
stateConnectionString 屬性設置爲 tcpip=服務器名稱:42424。
2.SQL Server模式:SQLServer 模式將會話狀態存儲到一個 SQL Server 數據庫中。使用此模式能夠確保在從新啓動 Web 應用程序時保留會話狀態,並使會話狀態可用於網絡場中的多個 Web 服務器。
若要將某個 ASP.NET 應用程序配置爲使用 SQLServer 模式,請在該應用程序的 Web.config 文件中執行如下操做:
在命令提示符中輸入如下命令
效果以下圖所示
完成後發現數據庫中有一個ASPState的數據庫,包含表兩張和若干個存儲過程
用於存儲session值的表示ASPStateTempSessions,當咱們訪問一個頁面打開一個會話的時候,就往裏面寫入了一條數據
我的估計字段[SessionItemShort]和[SessionItemLong]就是存儲Session值
3.自定義模式:Custom 模式指定您但願使用自定義會話狀態存儲提供程序來存儲會話狀態數據。在使用 Custom 的 Mode 配置 ASP.NET 應用程序時,必須使用 sessionState 配置元素的 providers 子元素指定會話狀態存儲提供程序的類型。使用 add 子元素來指定提供程序類型,幷包括指定提供程序類型名稱的 type 屬性以及指定提供程序實例名稱的 name 屬性。而後,將提供程序實例的名稱提供給 sessionState 元素的 customProvider 屬性,將 ASP.NET 會話狀態配置爲使用該提供程序實例來存儲和檢索會話數據。具體實現的話能夠參考兩個地方查看《會話狀態存儲提供程序示例 》和《如何:演示會話狀態存儲提供程序》
Session事件
Session事件有兩個:Session_OnStart 事件和 Session_OnEnd 事件;前者在新會話開始時引起,後者在會話被放棄或過時時引起。如需使用則定義在全局文件Global.asax裏面則可,可是Session_OnEnd 事件只有在會話模式是InProc,也就是使用進程內模式。
後記
最後粘貼一下整個sessionState的配置節