有你在真好 的个人博客
.Net中两个Cookie类的分析与比较
阅读:2392 添加日期:2021/3/22 16:07:19

.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的一些编码习惯,于是就有了这个类这样的设计。

在之前的提到过遍历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规范,所以这个类的设计多了那些属性。


ICP备案号:苏ICP备14035786号-1 苏公网安备 32050502001014号