只有累積,沒有奇蹟

2018年10月28日 星期日

[.NET] ASP.NET 狀態管理(State Management):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 state 、Control state、Hidden fields、Cookies 、Query 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
  1. // Set
  2. Session["test"] = lblTest.Text;
  3. // get
  4. if (Session["test"] != null)
  5. {
  6. lblTest.Text = "Hello" + Session["test"];
  7. }
  8. else
  9. {
  10. // do something
  11. }
DataSet
  1. //set DataSet
  2. Session["DataSet"] = myDataSet;
  3. //get DataSet
  4. if (Session["DataSet"] != null)
  5. {
  6. DataSet myDs = (DataSet)Session["DataSet"];
  7. }
  8. else
  9. {
  10. // do something
  11. }
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

Related Posts:

  • [Benchmark] String 比較字串效能分析前言 在 .NET 開發時很常會用到字串的比對,C# 中提供多種字串比對的方式,這篇文章就列出在 C# 提供的字串比方法,針對這幾種常用的方法使用  BenchmarkDotNet  做效能的測試及比對,並會在 .NET Framework 與 .NET Core 分別測試結果,若有問題或是錯誤的地方歡迎各位給予指導及討論。 測試代碼  測試使用  BenchmarkDotNe… Read More
  • [NETCore] 如何在 ASP.NET Core 中使用 YAML前言 今天同事在分享 ASP.NET Core 時介紹使用 YAML 作為組態設定檔,自己在過去比較少接觸 YAML 設定檔,也趁此機會來好好讓彼此熟悉一下,在 YAML 官網介紹說明文字如下 YAML is a human friendly data serialization standard for all programming languages. YAML 是一種可讀性高,適用於表達資料序列化的格式,在公司 CI… Read More
  • [NETCore] 動態 String 字串相加效能比較 前言 在前一篇 [.NETCore] String 字串相加效能比較 對於 C# string 的應用做了一些測試,得到在使用固定字串相加時使用 string 效能反而比 stringBuilder 來的好,在 string  有多種應用情境因此這篇就在針對另一種使用情境針對 string 動態文字相加做比較若有問題或是錯誤的地方歡迎各位給予指導及討論。 測試代碼  測試方式同樣以  B… Read More
  • [NETCore] ASP.NET Core 建立與解析 QueryString 參數說明 之前介紹過在 .NET 中可以使用 Utility.ParseQueryString 處理 Url 中的參數,傳送門 : 使用 ParseQueryString 取得網址參數,但所使用的 System.Web 命名空間僅存在於 ASP.NET Framework 不支援 ASP.NET Core,在搜尋更好的解決方案中發現了在 ASP.NET Core 提供新的 API - QueryHelpers 可以達到同樣效果,此… Read More
  • [NET] Task.Run 與 Task.Factory.StartNew前言  從 .NET 4.0 版本新增 TPL (Task Parallel Library) 函式庫,常在公司專案 Code 中可以看到 Task.Run 與 Task.Factory.StartNew 兩種建立任務的方式,某次同事也有提問對兩者的差異性不太明白,因此這篇文章整理自己對於兩者的相關資訊與用法,希望有不清楚或是自己研究錯誤的地方歡迎提出討論 探索問題 Task.Run 與 Task.Factory.StartN… Read More

0 意見:

張貼留言

Copyright © 2025 m@rcus 學習筆記 | Powered by Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com