使用 Request.QueryString 接受参数时,跟编码有关的一些问题
Net 提供了两个Cookie类:
System.Web.HttpCookie 类 和 System.Net.Cookie 类
对应的有两个Cookie 集合类
System.Web.HttpCookieCollection 类 和 System.Net.CookieCollection 类
我们一般来理解他们的区别就是下面简单的一句:
System.Web 命名空间下的是给服务器段用的,System.Net 是给客户端程序用的。
实际上不止这点区别:
下面我们来对比这两个Cookie类的属性如下,这些属性都是Copy自MSDN中文版的说明文档:
System.Web.HttpCookie 类 | System.Net.Cookie 类 |
MSDN中对构造函数的描述:
已重载。 初始化 HttpCookie 类的新实例。 |
MSDN中对构造函数的描述:
已重载。 根据 Netscape 规范初始化 Cookie 类的新实例。通常,应用程序无需构造 Cookie 类,因为该类会基于通过 HTTP 响应接收的 Set-Cookie 标头自动创建。 |
Comment 获取或设置服务器可添加到 Cookie 中的注释。 | |
CommentUri 获取或设置服务器可通过 Cookie 来提供的 URI 注释。 | |
Discard 获取或设置由服务器设置的丢弃标志。 | |
Domain 获取或设置将此 Cookie 与其关联的域。 |
Domain 获取或设置 Cookie 对其有效的 URI。 |
Expired 获取或设置 Cookie 的当前状态。 | |
Expires 获取或设置此 Cookie 的过期日期和时间。 |
Expires 获取或设置作为 DateTime 的 Cookie 过期日期和时间。 |
HttpOnly 确定页脚本或其他活动内容是否可访问此 Cookie。 | |
Name 获取或设置 Cookie 的名称。 |
Name 获取或设置 Cookie 的名称。 |
Path 获取或设置要与当前 Cookie 一起传输的虚拟路径。 |
Path 获取或设置此 Cookie 适用于的 URI。 |
Port 获取或设置此 Cookie 适用于的 TCP 端口的列表。 | |
Secure 获取或设置一个值,该值指示是否使用安全套接字层 (SSL)(即仅通过 HTTPS)传输 Cookie。 |
Secure 获取或设置 Cookie 的安全级别。 |
TimeStamp 获取此 Cookie 作为 DateTime 发出的时间。 | |
Value 获取或设置单个 Cookie 值。 |
Value 获取或设置 Cookie 的 Value。 |
Values 获取单个 Cookie 对象所包含的键值对的集合。 |
|
|
Version 获取或设置此 Cookie 符合的 HTTP 状态维护版本。 |
你会看到 System.Net.Cookie 类 比 System.Web.HttpCookie 类多好些属性,一些我们WEB开发人员都不清楚的属性。为什么呢?
这就要从 cookie规范 说起。目前有以下几种Cookie规范:
- Netscape cookie草案:是最早的cookie规范,基于rfc2109。尽管这个规范与rc2109有较大的差别,但是很多服务器都与之兼容。
- rfc2109, 是w3c发布的第一个官方cookie规范。理论上讲,所有的服务器在处理cookie(版本1)时,都要遵循此规范。遗憾的是,这个规范太严格了,以致很多服务器不正确的实施了该规范或仍在使用Netscape规范。
- rfc2965规范定义了cookie版本2,并说明了cookie版本1的不足。
rfc2965规范的使用,目前并不多。rfc2109规范相应要严格得多,在实际应用上,并不是所有的浏览器和Web服务器都严格遵守。因此相比较而言,Netscape cookie草案倒是一个比较简洁和被广泛支持的Cookie规范。
回过来我们再看 System.Web.HttpCookie 类 和 System.Net.Cookie 类的区别
我理解的他们的区别应该是:
System.Web.HttpCookie 类
这个类最初设计是考虑是WEB服务器用的,由于微软的WEB服务器并没有遵循 rfc2109 \rfc2965 规范。而是采用的 Netscape cookie草案方案。
同时为了兼顾以前ASP的一些编码习惯,于是就有了这个类这样的设计。
在 dudu 之前的一篇博客中提到的
遍历System.Web.HttpCookieCollection, 会有如下的写法:
foreach (string name in Request.Cookies)
{
info += string.Format("{0} = {1} \r\n
", name, Request.Cookies[name].Value);
}
而 foreach(HttpCookie cookie in Request.Cookies)会出错。 为何微软会有这样的设计就可以理解了。
System.Net.Cookie 类
这个类最初设计时候应该是考虑主要是客户端使用的,
由于考虑到有些服务器的Cookie 是遵循 rfc2109 \rfc2965 规范,所以这个类的设计多了那些属性。
相关资料:
System.Net.Cookie和System.Web.HttpCookie有什么区别
http://topic.csdn.net/t/20050304/15/3824900.html
为什么foreach(HttpCookie cookie in Request.Cookies)会出错
http://www.cnblogs.com/dudu/archive/2004/12/21/80118.html
HTTP代理如何正确处理Cookie
http://www.ibm.com/developerworks/cn/java/j-cookie/
Netscape cookies 草案
http://wp.netscape.com/eng/mozilla/3.0/handbook/javascript/cookies.htm
W3C的 rfc2109 规范
http://www.w3.org/Protocols/rfc2109/rfc2109.txt
W3C的 rfc2965 规范