標籤:style blog http color java 使用 os io
看到部落格園的一個哥們寫的面試經曆,想到了面試中常問到的Session,一時手癢就談下自己對Session的理解,這東西最開始在使用者登入登出的時候用到過,後來一直沒怎麼用過,裡面還是有很多知識點值得注意的。先簡單的說下吧,Session是分為用戶端Session和服務端Session:
用戶端Session
Session稱為工作階段狀態,是Web系統中最常用的狀態,用於維護和當前瀏覽器執行個體相關的一些資訊,當使用者首次與Web伺服器建立串連的時候,伺服器會給當前訪問使用者分發一個 SessionID作為標識。SessionID是一個由24個字元組成的隨機字串。使用者每次提交頁面,瀏覽器都會把這個SessionID包含在 Http頭中提交給Web伺服器,這樣Web伺服器就能區分當前請求頁面的是哪一個用戶端。這個SessionID就是儲存在用戶端的,屬於用戶端Session.(ASP.NET中你如果訪問一個幕後處理頁面,可以用Session.SessionID取值)。
用戶端Session預設是以cookie的形式來儲存的,所以當使用者禁用了cookie的話,伺服器端就得不到SessionID。這個時候你可以通過重寫URL,你可以在全域處理常式Global.asax中Application_Start方法中正則匹配一下將SessionID直接寫在新的url中。
服務端的Session也就是我們最常用的,為了更好的使用服務端的Session,可以先看一下SessionStateMode這個枚舉:
public enum SessionStateMode { // 摘要: // 工作階段狀態被禁用。 Off = 0, // // 摘要: // 工作階段狀態正在處理 ASP.NET 輔助進程。 InProc = 1, // // 摘要: // 工作階段狀態正在使用進程外 ASP.NET 狀態服務儲存狀態資訊。 StateServer = 2, // // 摘要: // 工作階段狀態正在使用進程外 SQL Server 資料庫儲存狀態資訊。 SQLServer = 3, // // 摘要: // 工作階段狀態正在使用自訂資料存放區來儲存工作階段狀態資訊。 Custom = 4, }Inproc(進程內)模式
此模式將工作階段狀態儲存在 Web 服務器上的記憶體中,這是預設設定,是唯一支援Session_OnEnd 事件的模式。Session資料儲存在IIS的inetinfo.exe進程中,這個方式是最常用的,效能最高,比較簡單,唯一的缺點就是IIS重啟的時候Session會丟失。
StateServer(狀態伺服器)模式
StateServer 模式將工作階段狀態儲存在一個稱為 ASP.NET 狀態服務的進程中(服務中的ASP.NET State Service服務 ),該進程是獨立於 ASP.NET 輔助進程或 IIS 應用程式集區的單獨進程。這種情況下Session會被儲存在Asp.Net進程之外的aspnet_state.exe進程中,這個進程不受asp.net進程回收的影響。
若要將某個 ASP.NET 應用程式配置為使用 StateServer模式,可以在Web.config檔案中配置:將 SessionState元素的 mode屬性設定為StateServer,將
stateConnectionString屬性設定為tcpip=伺服器名稱:42424。Web.Config中的配置如下:
(如果是本地設成127.0.0.1就行,連接埠是預設的,如果想修改的話可以去註冊表中修改)
SQL Server 模式
SqlServer模式將工作階段狀態儲存到一個 SQL Server 資料庫中,可以確保在重新啟動 Web 應用程式時保留工作階段狀態,如果是 SQL Server模式,則儲存在工作階段狀態中的對象必須是可序列化的.
若要使用SqlServer模式,首先要在 SQL Server上安裝了 ASP.NET 工作階段狀態資料庫。可以使用 Aspnet_regsql.exe 工具安裝 ASP.NET 工作階段狀態資料庫。
使用 Aspnet_regsql.exe 工具安裝工作階段狀態資料庫
C:\Windows\Microsoft.NET\Framework64\v4.0.30319(選擇NET版本,裡面都有Aspnet_regsql.exe)
狀態資料庫是需要在命令列中執行如下命令:aspnet_regsql.exe -S local -E -ssadd -sstype p
執行之後我們可以看到如下兩張表:
-sstype之後的參數是可選的
t 將會話資料存放區到 SQL Server tempdb 資料庫中。這是預設設定。如果將會話資料存放區到 tempdb 資料庫中,則在重新啟動 SQL Server 時將丟失會話資料。
p 將會話資料存放區到 ASPState 資料庫中,而不是儲存到 tempdb 資料庫中。
c 將會話資料存放區到自訂資料庫中。如果指定 c 選項,則還必須使用 -d 選項包括自訂資料庫的名稱
(詳細命令可參考http://msdn.microsoft.com/zh-cn/library/ms229862(v=vs.100).aspx)
自訂模式
Custom模式指的是定義工作階段狀態儲存提供者來儲存工作階段狀態資料。一般情況下你如果用的SQL Server就沒必要使用自訂儲存,使用的Oracle或者MySQL可以使用(沒有實際操作過),你可以通過建立一個繼承SessionStateStoreProviderBase 類的類,來實現自訂工作階段狀態儲存提供者。然後在設定檔中進行相關配置,詳情請參考http://msdn.microsoft.com/zh-cn/library/ms178587(v=vs.80).aspx.
小結
Session的預設儲存在在IIS其實效能最高的,只是有的時候不穩定會丟失,Session的生命週期都是第一次訪問的時候建立,逾時銷毀,StateServer和SQLSERVER儲存的話由於序列化和還原序列化的原因會消耗CPU資源,SQLServer從資料庫讀取的速度也不快,預設的有的時候還是挺不錯的,Session的建議不要存放大量資料。單個銷毀Session的之後可以用Session.Remove("名稱"),銷毀所有:Session.Abandon()或者Session.Clear()。
如果是構建高效能可擴充的ASP.NET網站中使用Session,那麼必須解決一個的問題就是分布式Session的架構,由於本人行業限制,沒有涉及到這一塊,園友有人提出瞭解決方案,具體可參考http://www.cnblogs.com/luminji/archive/2011/11/03/2195704.html。
以上轉載自: http://www.cnblogs.com/xiaofeixiang/p/3891253.html#3002591