Dot-Net

.NET HttpSessionState 不區分大小寫

  • November 13, 2009

.NET 的HttpSessionState使用“ InProc ”儲存似乎將會話變數鍵值視為不區分大小寫。例如:

session["foo"] = 1;
session["Foo"] = 2;
Trace.Write(session["foo"].ToString()); // => 2

這種行為似乎沒有記錄,所以我想知道它是否只是底層會話儲存機制的副作用,還是由類本身有意實現的。由於 C# 將其他所有內容都視為區分大小寫,因此會話不以相同方式操作有點令人不安。是什麼賦予了?是否因店鋪類型而異?是否可以向後兼容 VB?

HttpSessionState 的鍵不區分大小寫以匹配經典 ASP 會話對象的行為。這使得開發人員可以更輕鬆地將其 ASP 應用程序移植到 ASP.NET,而不會引入細微的區分大小寫問題。

QueryString、Cookies 等對象和其他類似於 Classic-ASP 內置對象的相同的不區分大小寫鍵的行為也是如此。

在設計 ASP.NET 時,我在 Microsoft 的 IIS 團隊工作,ASP.NET 努力使 ASP.NET 程式碼盡可能向後兼容 ASP。這並不意味著 ASP.NET 具有完美的向後兼容性,但是每當做出決定時(例如這種區分大小寫的決定),預設答案是匹配經典 ASP 行為,除非有充分的理由不這樣做。

也就是說,我同意可以更好地記錄 Session 的不區分大小寫。

順便說一句,ASP.NET 會話集合從NameObjectCollectionBase獲取其案例行為,NameObjectCollectionBase是所有 ASP.NET 內置對象的基類,用於 Cookie、會話狀態、應用程序狀態、標頭等。來自文件:

這個類的底層結構是一個雜湊表。

每個元素都是一個鍵/值對。

NameObjectCollectionBase 的容量是 NameObjectCollectionBase 可以容納的元素數。隨著元素被添加到 NameObjectCollectionBase,容量會根據需要通過重新分配自動增加。

雜湊碼提供程序為 NameObjectCollectionBase 實例中的鍵分配雜湊碼。預設雜湊碼提供程序是 CaseInsensitiveHashCodeProvider。

比較器確定兩個鍵是否相等。預設比較器是 CaseInsensitiveComparer。

在 .NET Framework 1.0 版中,此類使用區分區域性的字元串比較。但是,在 .NET Framework 1.1 版及更高版本中,此類在比較字元串時使用 CultureInfo..::.InvariantCulture。有關區域性如何影響比較和排序的詳細資訊,請參閱比較和排序特定區域性的數據、比較和排序特定區域性的數據和執行不區分區域性的字元串操作。

一個合理的後續問題是:為什麼經典的 ASP 設計有不區分大小寫的鍵?這樣做的原因是,早在 1996 年(或前後),與 ASP 一起使用的主要語言是 VBScript,因此迎合 VB 開發人員不區分大小寫的期望是有意義的。

引用自:https://stackoverflow.com/questions/1731283