ASP.NET中Session的個人淺談


 
看到博客園的一個哥們寫的面試經歷,想到了面試中常問到的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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM