ASP.NET中Session的我的淺談

 
看到博客園的一個哥們寫的面試經歷,想到了面試中常問到的Session,一時手癢就談下本身對Session的理解,這東西最開始在用戶登陸登出的時候用到過,後來一直沒怎麼用過,裏面仍是有不少知識點值得注意的。先簡單的說下吧Session是分爲客戶端Session和服務端Session:
html

客戶端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,將 sql

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 工具安裝會話狀態數據庫cookie

C:\Windows\Microsoft.NET\Framework64\v4.0.30319(選擇NET版本,裏面都有Aspnet_regsql.exe)session

狀態數據庫是須要在命令行中執行以下命令:aspnet_regsql.exe -S local -E -ssadd -sstype p   架構

執行以後咱們能夠看到以下兩張表:asp.net

-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。

相關文章
相關標籤/搜索