.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