使用 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 规范

http://www.ietf.org/rfc/rfc2965.txt

posted @ 2008-12-29 10:37  徐小朝  阅读(417)  评论(0编辑  收藏  举报