這兩天做了一個獲取cookie並且攜帶此cookie去請求另外一個url地址,中間攜帶cookie用了兩種方式:
1. httpRequest.CookieContainer= cookie (此cookie為一個cookie容器對象)
2.httpRequest.Headers.Add("Cookie", cookie) (此cookie為一個cookie字符串)
測試結果:1種方式cookie失效並且丟失。2種方式攜帶成功並且可以成功顯示已登錄。
原因待查,記錄下。
說明:也可能cookie容器設置的方式有問題。
附上代碼:
public class Login { public string GetCookie(string postString, string postUrl) { CookieContainer cookie = new CookieContainer(); HttpWebRequest httpRequset = (HttpWebRequest)HttpWebRequest.Create(postUrl);//創建http 請求 httpRequset.CookieContainer = cookie;//設置cookie httpRequset.Method = "POST";//POST 提交 httpRequset.KeepAlive = true; httpRequset.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36"; httpRequset.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"; httpRequset.ContentType = "application/x-www-form-urlencoded";//以上信息在監聽請求的時候都有的直接復制過來 httpRequset.Referer = "http://my.qianlima.com/login.jsp"; byte[] bytes = System.Text.Encoding.UTF8.GetBytes(postString); httpRequset.ContentLength = bytes.Length; Stream stream = httpRequset.GetRequestStream(); stream.Write(bytes, 0, bytes.Length); stream.Close();//以上是POST數據的寫入 HttpWebResponse httpResponse = (HttpWebResponse)httpRequset.GetResponse();//獲得 服務端響應 var str = cookie.GetCookieHeader(httpRequset.RequestUri); return str;//拿到cookie } public string GetContent(string cookie, string url) { string content; HttpWebRequest httpRequest = (HttpWebRequest)HttpWebRequest.Create(url); httpRequest.Headers.Add("Cookie", cookie); httpRequest.Referer = url; httpRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36"; httpRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"; httpRequest.ContentType = "application/x-www-form-urlencoded"; httpRequest.Method = "GET"; HttpWebResponse httpResponse = (HttpWebResponse)httpRequest.GetResponse(); using (Stream responsestream = httpResponse.GetResponseStream()) { using (StreamReader sr = new StreamReader(responsestream, System.Text.Encoding.Default)) { content = sr.ReadToEnd(); } } return content; } }
此文章由機器翻譯。 將光標移到文章的句子上,以查看原文。
更多信息。
|
譯文
原文
|
CookieContainer 類
為 CookieCollection 對象的集合提供容器。
程序集: System(System.dll 中)
名稱 | 說明 | |
---|---|---|
![]() |
CookieContainer() |
初始化 CookieContainer 類的新實例。 |
![]() |
CookieContainer(Int32) |
使用指定的表示容器可以包含的 Cookie 實例數的值初始化 CookieContainer 類的新實例。 |
![]() |
CookieContainer(Int32, Int32, Int32) |
使用指定屬性初始化 CookieContainer 類的新實例。 |
名稱 | 說明 | |
---|---|---|
![]() |
Capacity |
獲取和設置 CookieContainer 可以包含的 Cookie 實例數。 |
![]() |
Count |
獲取 CookieContainer 當前包含的 Cookie 實例數。 |
![]() |
MaxCookieSize |
表示 Cookie 的最大允許長度。 |
![]() |
PerDomainCapacity |
獲取和設置 CookieContainer 可以在每個域包含的 Cookie 實例數。 |
名稱 | 說明 | |
---|---|---|
![]() |
Add(Cookie^) | |
![]() |
Add(CookieCollection^) |
將 CookieCollection 的內容添加到 CookieContainer 中。 |
![]() |
Add(Uri^, Cookie^) |
將 Cookie 添加到特定 URI 的 CookieContainer 中。 |
![]() |
Add(Uri^, CookieCollection^) |
將 CookieCollection 的內容添加到特定 URI 的 CookieContainer 中。 |
![]() |
Equals(Object^) |
確定指定的對象是否等於當前對象。(從 Object 繼承。) |
![]() |
Finalize() |
在垃圾回收將某一對象回收前允許該對象嘗試釋放資源並執行其他清理操作。(從 Object 繼承。) |
![]() |
GetCookieHeader(Uri^) |
獲取 HTTP Cookie 標頭,該標頭包含表示與特定 URI 關聯的 Cookie 實例的 HTTP Cookie。 |
![]() |
GetCookies(Uri^) |
獲取包含與特定 URI 關聯的 Cookie 實例的 CookieCollection。 |
![]() |
GetHashCode() |
作為默認哈希函數。(從 Object 繼承。) |
![]() |
GetType() | |
![]() |
MemberwiseClone() | |
![]() |
SetCookies(Uri^, String^) |
將 HTTP Cookie 標頭中的一個或多個 Cookie 的 Cookie 實例添加到特定 URI 的 CookieContainer 中。 |
![]() |
ToString() |
返回表示當前對象的字符串。(從 Object 繼承。) |
名稱 | 說明 | |
---|---|---|
![]() ![]() |
DefaultCookieLengthLimit |
表示 CookieContainer 可以包含的 Cookie 實例的默認最大大小(以字節為單位)。此字段為常數。 |
![]() ![]() |
DefaultCookieLimit |
表示 CookieContainer 可以包含的 Cookie 實例的默認最大數目。此字段為常數。 |
![]() ![]() |
DefaultPerDomainCookieLimit |
表示 CookieContainer 可以在每個域引用的 Cookie 實例的默認最大數目。此字段為常數。 |
CookieContainer 是為 Cookie 類的實例提供存儲空間的數據結構,該結構以類似於數據庫的方式來進行訪問。 CookieContainer 具有容量限制,此限制在創建容器或通過屬性更改容器時設置。
Cookie 類的實例被添加到基於其起始 URI 的容器。它會被添加到與該 URI 關聯的內部 CookieCollection。 Cookie 作為 CookieCollection 或作為可用於提交 HTTP WebRequest 的字符串,從基於該 URI 的容器中進行檢索。
CookieContainer 有三項屬性用於管理容器的內容容量:Capacity、MaxCookieSize 和 PerDomainCapacity。這些值的默認設置分別為 300、4096 和 20。當一個 Cookie 被添加到容器中時,這些屬性將用於確定是否應丟棄已包含在 CookieContainer 中的 Cookie,以便給新的 Cookie 讓出空間。 CookieContainer 對每一次添加進行跟蹤,以確保不會超過 Capacity 限制或 PerDomainCapacity 限制。如果超過這兩項限制或其中一項限制,則將移除 CookieContainer 所包含的 Cookie 實例。首先,所有過期的 Cookie 都將被移除。如果必須進一步收回容量,則清除最早使用的CookieCollection。