21

.NET 的HttpSessionState使用“ InProc ”存储似乎将会话变量键值视为不区分大小写。例如:

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

这种行为似乎没有记录,所以我想知道它是否只是底层会话存储机制的副作用,还是由类本身有意实现的。由于 C# 将其他所有内容都视为区分大小写,因此会话不以相同的方式操作有点令人不安。是什么赋予了?是否因店铺类型而异?是否可以向后兼容 VB?

4

2 回答 2

35

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 开发人员不区分大小写的期望是有意义的。

于 2009-11-13T19:59:50.727 回答
0

虽然 C# 区分大小写,但 ASP.NET 中的这些结构不区分大小写,因为 HTML 中的大部分内容不区分大小写(至少在 HTML4 中——XHTML 是区分大小写的,或者当然)。我相信这是在课堂上实现的。它与状态是在进程中还是在其他地方无关。

于 2009-11-13T19:48:28.410 回答