.NET HttpSessionState案例不敏感

时间:2009-11-13 19:20:15

标签: .net asp.net session-state session-variables case-sensitive

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

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

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

2 个答案:

答案 0 :(得分:34)

HttpSessionState的键不区分大小写,以匹配传统ASP Session对象的行为。这使得开发人员可以更轻松地将ASP应用程序移植到ASP.NET,而不会引入细微的区分大小写问题。

QueryString,Cookies等对象和其他类似于Classic-ASP的内置对象也存在相同的不区分大小写的行为。

在设计ASP.NET时,我在Microsoft的IIS团队工作,并且ASP.NET努力使ASP.NET代码尽可能向后兼容ASP。这并不意味着ASP.NET具有完美的向后兼容性,但无论何时出现决策(如此区分大小写),默认答案是匹配经典ASP行为,除非有充分的理由不这样做。

尽管如此,我同意Session的案例不敏感性可以更好地记录下来。

BTW,ASP.NET Session集合从NameObjectCollectionBase获取其案例行为,{{3}}是Cookie,会话状态,应用程序状态,标题等所有ASP.NET内置对象的基类。文档:

  

此基础结构   class是一个哈希表。

     

每个元素都是键/值对。

     

一个人的能力   NameObjectCollectionBase是数字   元素的   NameObjectCollectionBase可以容纳。如   元素被添加到a   NameObjectCollectionBase,容量   根据需要自动增加   通过重新分配。

     

哈希码提供程序分配哈希值   密钥的代码   NameObjectCollectionBase实例。该   默认的哈希码提供者是   CaseInsensitiveHashCodeProvider。

     

比较器确定是否两个   钥匙是平等的。默认比较器   是CaseInsensitiveComparer。

     

在.NET Framework 1.0版中,这个   class使用区分文化的字符串   比较。但是,在.NET中   框架版本1.1及更高版本,这个   课堂使用   CultureInfo .. ::。InvariantCulture时   比较字符串。更多   有关文化如何影响的信息   比较和排序,请参阅比较   和特定的数据排序   文化比较与排序数据   特定文化与表演   文化不敏感的字符串操作。

一个合理的后续问题是:为什么经典ASP使用不区分大小写的键设计?原因是,早在1996年(或其左右),ASP使用的主要语言是VBScript,因此有必要迎合VB开发人员对案例不敏感的期望。

答案 1 :(得分:0)

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

相关问题