两个Cookie类
.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 |
Domain |
Expired 获取或设置 Cookie 的当前状态。 |
|
Expires |
Expires |
HttpOnly |
|
Name |
Name |
Path |
Path |
Port |
|
Secure |
Secure |
TimeStamp |
|
Value |
Value |
Values |
|
Version |
你会看到 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 规范