由一個業務需求引發的對 ASP.NET 全域性變數的調研及結果

代码掌控者發表於2024-11-08

Coding-10

前言

前段時間使用 ASP.NET MVC + Form Auth 做了一個單機小專案,當時對於採用什麼方式來儲存登入狀態有些糾結,通常的做法是使用 Cookie 或者 Session,但是我想有沒有更好的方式來儲存登入狀態呢?於是花了點時間調研了 ASP.NET 的全域性變數使用方式,希望能找到更好的方式來儲存登入狀態。

以下是本次調研過程及總結。

調研過程及總結

Application

測試過程:

  1. LoginController 在 Chrome 瀏覽器寫入 Application["Test"] 的值
  2. 在 Edge 瀏覽器開啟,Application["Test"] 的值依然存在

結論

Application 是全域性性的,不太適合儲存登入狀態

Session

測試過程:

  1. LoginController 在 Chrome 瀏覽器寫入 Session["Test"] 的值
  2. 重新重新整理 Chrome 瀏覽器頁面,值存在
  3. 在 Edge 瀏覽器開啟,Session["Test"] 的值不存在

結論

Session 適合儲存登入狀態,其值儲存在伺服器端,重啟 IIS 或者到時間(預設是20分鐘)等方式都會使其丟失

Cookie

測試過程:

  1. LoginController 在 Chrome 瀏覽器寫入 HttpCookie ["Test"] 的值
  2. 重新重新整理 Chrome 瀏覽器,值存在
  3. 在 Edge 瀏覽器 開啟,cookie 不存在

結論

Cookie 適合儲存登入狀態,其值儲存在客戶端,不能儲存太多資訊,安全性沒有 Session 好

靜態變數

測試過程:

  1. LoginController 在 Chrome 瀏覽器寫入靜態變數 GlobalTest.MyLogin 的值
  2. 在 Edge 瀏覽器開啟,GlobalTest.MyLogin 的值依然存在

結論

靜態變數是全域性性的,不太適合儲存登入狀態

總結

權衡之下,最終還是選擇使用 Session,在單機模式下,Session 相對比較安全可靠。當然還可以把登入狀態持久化到本地檔案或者資料庫中,不過這又是另外一回事了,維護起來也相對比較麻煩。

我是老楊,一個執著於程式設計樂趣、至今奮鬥在一線的 10年+ 資深研發老鳥,是軟體專案管理師,也是快樂的程式猿,持續免費分享全棧實用程式設計技巧、專案管理經驗和職場成長心得!歡迎關注老楊的公眾號(名稱:程式碼掌控者),更多幹貨等你來

往期精彩

  1. C# 靜態類,高手不想讓你知道的 15 個真相
  2. 封裝一個 C# 範圍判斷函式,從此告別重複編寫範圍判斷程式碼的煩惱
  3. 用 C# Stopwatch 計時,讓程式碼效能飛起來!
  4. 輕裝上陣,Visual Studio LocalDB:.NET 程式設計師的本地資料庫神器
  5. 封裝一個C#萬能基礎資料型別轉換器,一招解決所有基礎型別轉換煩惱
  6. 閒話 .NET(7):.NET Core 能淘汰 .NET FrameWork 嗎?
  7. 常用的 4 種 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)對比總結
  8. C# AutoMapper 10個常用方法總結
  9. C# 7個方法比較兩個物件是否相等
  10. C# 去掉字串最後一個字元的 4 種方法

image

相關文章