這兩天做了一個擷取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 類
.NET Framework 4.6 and 4.5 其他版本

為 CookieCollection 對象的集合提供容器。
命名空間: System.Net
程式集: System(System.dll 中)
繼承層次結構 System::Object
System.Net::CookieContainer
文法 C++
[SerializableAttribute]
public ref class CookieContainer
構造函數
名稱 | 說明 | |
---|---|---|
| CookieContainer() | 初始化 CookieContainer 類的新執行個體。 |
| CookieContainer(Int32) | 使用指定的表示容器可以包含的 Cookie 執行個體數的值初始化 CookieContainer 類的新執行個體。 |
| CookieContainer(Int32, Int32, Int32) | 使用指定屬性初始化 CookieContainer 類的新執行個體。 |
屬性
名稱 | 說明 | |
---|---|---|
| Capacity | 擷取和設定 CookieContainer 可以包含的 Cookie 執行個體數。 |
| Count | 擷取 CookieContainer 目前包含的 Cookie 執行個體數。 |
| MaxCookieSize | 表示 Cookie 的最大允許長度。 |
| PerDomainCapacity | 擷取和設定 CookieContainer 可以在每個域包含的 Cookie 執行個體數。 |
方法
名稱 | 說明 | |
---|---|---|
| Add(Cookie^) | 将 Cookie 添加到 CookieContainer。此方法使用 Cookie 中的域來确定将 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() | 擷取目前執行個體的 Type。(從 Object 繼承。) |
| MemberwiseClone() | 建立目前 Object 的淺表副本。(從 Object 繼承。) |
| 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。
轉載于:https://www.cnblogs.com/jiaoxh/p/5092135.html
版權聲明:本文為CSDN部落客「weixin_30682127」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。
原文連結:https://blog.csdn.net/weixin_30682127/article/details/99773856