在 WebClient 中接受 Cookie?
Posted
技术标签:
【中文标题】在 WebClient 中接受 Cookie?【英文标题】:Accept Cookies in WebClient? 【发布时间】:2013-01-27 19:34:32 【问题描述】:我刚刚开始尝试使用 C# WebClient
。我所拥有的是下面的代码,它从网站获取 html 代码并将其写入 .txt 文件。我唯一的问题是某些网站要求您在使用该网站之前接受 cookie。这导致不是将真实的网站 html 代码写入 .txt 文件,而是写入 cookie 弹出 html 代码。
代码:
string downloadedString;
System.Net.WebClient client;
client = new System.Net.WebClient();
//"http://nl.wikipedia.org/wiki/Lijst_van_spelers_van_het_Nederlands_voetbalelftal"
downloadedString = client.DownloadString(textBox1.Text);
using (StreamWriter write = new StreamWriter("Data.txt"))
write.Write(downloadedString);
那么解决这个问题的方法是什么?有人可以指引我走向正确的道路吗?
【问题讨论】:
在这种特殊情况下,API mediawiki.org/wiki/API:Main_page 可以使自动下载更容易。 你一定是指 .NET WebClient 类,因为没有“C# WebClient”。 【参考方案1】:用法:
CookieContainer cookieJar = new CookieContainer();
cookieJar.Add(new Cookie("my_cookie", "cookie_value", "/", "mysite"));
CookieAwareWebClient client = new CookieAwareWebClient(cookieJar);
string response = client.DownloadString("http://example.com/response_with_cookie_only.php");
public class CookieAwareWebClient : WebClient
public CookieContainer CookieContainer get; set;
public Uri Uri get; set;
public CookieAwareWebClient()
: this(new CookieContainer())
public CookieAwareWebClient(CookieContainer cookies)
this.CookieContainer = cookies;
protected override WebRequest GetWebRequest(Uri address)
WebRequest request = base.GetWebRequest(address);
if (request is HttpWebRequest)
(request as HttpWebRequest).CookieContainer = this.CookieContainer;
HttpWebRequest httpRequest = (HttpWebRequest)request;
httpRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
return httpRequest;
protected override WebResponse GetWebResponse(WebRequest request)
WebResponse response = base.GetWebResponse(request);
String setCookieHeader = response.Headers[HttpResponseHeader.SetCookie];
//do something if needed to parse out the cookie.
if (setCookieHeader != null)
Cookie cookie = new Cookie(); //create cookie
this.CookieContainer.SetCookies(request.RequestUri, setCookieHeader);
return response;
您将看到 GetWebRequest 和 GetWebResponse 的两个重写方法。可以重写这些方法来处理 cookie 容器。
【讨论】:
你检查setCookieHeader != null
两次有什么原因吗?
Exception::: 参数不能为空。参数名称:cookie.domain
为什么要公开Uri
属性?
替换 this.CookieContainer.Add(cookie);用 this.CookieContainer.SetCookies(request.RequestUri, setCookieHeader);【参考方案2】:
只需将来自标头的 cookie 字符串存储到本地会话 _cookies 字符串中
if (System.Web.HttpContext.Current.Session["cookie"] != null)
_cookies = System.Web.HttpContext.Current.Session["cookie"].ToString();
using (WebClient wc = new WebClient())
wc.Headers.Add("Cookie", _cookies);
string HtmlResult = wc.UploadString(bridge_url, myParameters);
_cookies = wc.ResponseHeaders["Set-Cookie"];
Debug.WriteLine("Headers" + _cookies);
System.Web.HttpContext.Current.Session["cookie"] = _cookies;
【讨论】:
【参考方案3】:这可能是 How can I get the WebClient to use Cookies? 的近似副本
我上面提到的问题是针对 VB.NET 的,但是对于 C#,机制应该是相同的。我怀疑您看到的行为是网站正在发送 cookie,然后请求返回,但您的客户端未设置为将 cookie 返回到服务器,因此它将其解释为您“不接受 cookie”。
您是否使用过 Fiddler 之类的分析工具来分析与客户交流的内容?
您可能还必须发送一个特定的 HTTP 标头以表明您接受 cookie,但我不记得在我过去的经验中这是必需的。
【讨论】:
你的意思是 原来的问题是针对 VB.NET,? 我在回答中链接的关于 *** 的现有问题是针对 VB.BET 的。由于您使用的是 C#,因此上一个问题的答案中的语法会有所不同,但方法是相同的,因为两者都使用 .NET 类。我编辑了我的答案以澄清这一点。以上是关于在 WebClient 中接受 Cookie?的主要内容,如果未能解决你的问题,请参考以下文章
WebClient 5.3+ 交换与 exchangeToMono。一起提取 cookie 和 body