ASP.NET中Session的個人淺談

來源:互聯網
上載者:User

標籤: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中的配置如下:
  •     <sessionState mode="StateServer" stateConnectionString="tcpip=伺服器位址:42424" cookieless="false" timeout="20"/>

(如果是本地設成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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.