[.NET] ASP.NET 狀態管理(State Management):Session

[.NET] ASP.NET Session 概論

Session 狀態支援數種不同的資料儲存選項,簡單描述 Session 可用的狀態模式

InProc:存在Web伺服器的記憶體中;ASP.NET中預設的Session狀態設定,是最常用也是最方便的 Session 狀態模式,缺點是如果重新啟動伺服器,所有的Session資料將會遺失。
StateServer:儲存在 ASP.NET 狀態服務的處理序中;可以確保 Session 在 Web 應用程式重新啟動時保留下來,並且讓 Web 伺服陣列中的多個 Web 伺服器都能夠使用工作階段狀態。
SQLServer :儲存在SQL Server資料庫中;這樣可以確保工作階段狀態在 Web 應用程式重新啟動時保留下來,並且讓 Web 伺服陣列中的多個 Web 伺服器都能夠使用工作階段狀態。
Customer:自訂 Session State Provider,存放 Session 的資料;必須使用 sessionState 組態

前言

HTTP是沒有狀態(Stateless)的通訊協定,ASP.NET 提供數種狀態管理機制,分為用戶端與伺服器端兩種,用戶端包含 View stateControl state、Hidden fields、CookiesQuery strings 五種;伺服器端則有 Application state、Session state、Profile Properties 三種,之前小弟的文章有介紹過 ASP.NET 狀態管理 - ViewState ,今天則要介紹網頁中重要且很常用的 Session,若文章中有錯誤的地方,也請各位不吝指教!

Session係蝦米?

Web是沒有狀態的(重要觀念,小弟查閱的每篇文章都有提到!),剛剛有提到過,由於HTTP是沒有狀態的通訊協定,這表示Web伺服器會將網頁的每個HTTP要求視為獨立要求。ASP.NET Session是儲存於伺服器端(Server-Base)的狀態管理機制,預設會儲存在Server的記憶體中,Session 可以支援任何類型的物件來儲存及自訂Session名稱。Web Server 在儲存Session資料時,每一個用戶端的Session 資料是會獨立儲存的,如下圖所示


 

Session ID

Session ID 是用來瀏覽器與伺服器溝通用的,會放在 Cookie 或是 URL 中,以純文字方式在伺服器和瀏覽器之間傳送;當建立 Session 時,ASP.NET 透過獨特的演算法(unique 120-bit identifier)隨機產生一組對應的 Session ID,這個數字是獨一無二的,隨機的用意是為了防止惡意用戶不能透過解密的方式取的用戶的資料。

這裡ExploringSession 文章中其中講解整個流程的關係

explorSession

  • 使用者透過網頁提出儲存Session資料需求
  • 伺服器產生識別用的的Session ID給使用者瀏覽器使用(存放在Cookie中),並將Session資料儲存在 Session State Provider 中
  • 使用者瀏覽器將Session ID資訊傳送給Server,提出修改Session 資料內容。
  • ASP.NET 會透過 SessionID 在 Session Providers 尋找相對應的 Session 物件,找到後從狀態伺服器(State Server)中取得序列化的數據和類型轉換為物件,最後在傳給需求的網頁。

使用方式

使用上與 ViewState 很像,可以透過 HttpSessionState 類別(System.Web.SessionState) 取得內建的Session 物件儲存/或讀取,用法如下

string


// Set
Session["test"] = lblTest.Text;

// get
if (Session["test"] != null)
{
    lblTest.Text = "Hello" + Session["test"];
}
else
{
    // do something 
}

DataSet


//set DataSet
Session["DataSet"] = myDataSet;

//get DataSet
if (Session["DataSet"] != null)
{
    DataSet myDs = (DataSet)Session["DataSet"];
}
else
{
    // do something 
}

Session 狀態模式

下圖簡單介紹 Session 狀態的結構

SessionStateArchitecture

Session 狀態支援數種不同的資料儲存選項,簡單描述 Session 可用的狀態模式

  • InProc
    存在Web伺服器的記憶體中;ASP.NET中預設的Session狀態設定,是最常用也是最方便的 Session 狀態模式,缺點是如果重新啟動伺服器,所有的Session資料將會遺失。
  • StateServer
    儲存在 ASP.NET 狀態服務的處理序中;可以確保 Session 在 Web 應用程式重新啟動時保留下來,並且讓 Web 伺服陣列中的多個 Web 伺服器都能夠使用工作階段狀態。
  • SQLServer
    儲存在SQL Server資料庫中;這樣可以確保工作階段狀態在 Web 應用程式重新啟動時保留下來,並且讓 Web 伺服陣列中的多個 Web 伺服器都能夠使用工作階段狀態。
  • Customer
    自訂 Session State Provider,存放 Session 的資料;必須使用 sessionState 組態項目的providers 子項目,指定工作階段狀態存放區提供者的類型。
  • Off
    停用Session

當需要選擇不同存取模式時,可在Web.Config檔案中設定 sessionState 項目的mode 屬性,








詳細 Session 狀態模式可以參考 工作階段狀態模式 from MSDN

設定狀態

可以透過Web.Config檔案中組態區段 sessionState 來設定 Session 狀態

sessionState 常用的項目為

  • Mode:指定儲存資料模式,請參考前一段內容。
  • Timeout:設定逾時週期時間,預設為20分鐘(以分鐘為單位)。
  • EnableSessionState:指定 @ Page 指示詞中 Session為啟用、停用或是唯獨。
  • Cookieless:設定 Session ID 是否內嵌於 URL 或儲存於 HTTP Cookie
  • StateConnectionString:用戶端與伺服器之間傳送的方式 

補充&參考

此篇文章是上網查詢自己整理的結果,如果內容有錯誤的地方,麻煩各位高手給予小弟指導

如果覺得此篇文章不錯,請幫忙點選「我要推薦」;讓我有持續努力的動力,謝謝 :D

工作階段狀態模式

HttpSessionState 成員

ASP.NET 工作階段狀態概觀

【读书笔记】ASP.NET State Management

Exploring Session in ASP.Net(推薦)

Understanding Session Object in ASP.NET 2.0(推薦)

ASP.NET Session State Partitioning using State Server Load Balancing