如何将Cookie添加到WebRequest?
我试图对一些代码进行unit testing,我需要替换它:
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create( uri ); httpWebRequest.CookieContainer = new CookieContainer();
同
WebRequest webRequest = WebRequest.Create( uri ); webRequest.CookieContainer = new CookieContainer();
基本上,如何在不使用HttpWebRequest的情况下将cookie添加到请求中?
根据您的意见,您可以考虑编写扩展方法 :
public static bool TryAddCookie(this WebRequest webRequest, Cookie cookie) { HttpWebRequest httpRequest = webRequest as HttpWebRequest; if (httpRequest == null) { return false; } if (httpRequest.CookieContainer == null) { httpRequest.CookieContainer = new CookieContainer(); } httpRequest.CookieContainer.Add(cookie); return true; }
然后你可以有如下代码:
WebRequest webRequest = WebRequest.Create( uri ); webRequest.TryAddCookie(new Cookie("someName","someValue"));
WebRequest是一个没有CookieContainer属性的抽象类。 此外,您不能使用Headers集合(未实现的exception),因此任何类似webRequest.Headers.Add(“Cookie”,“…”)的尝试都将失败。
抱歉,您没有机会在WebRequest中使用Cookie。
坚持使用HttpWebRequest并使用其Headers系列添加/编辑您喜欢的任意数量的cookie!
试试这样的事情:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.contoso.com/default.html"); request.CookieContainer.Add(new Cookie("ConstoCookie", "Chocolate Flavour"));
dlev的答案最终起作用了,但我在实现解决方案时遇到了问题(“参数'{0}’不能是空字符串。”),所以我决定编写完整的代码以防其他人有类似的问题。
我的目标是将html作为字符串,但我需要将cookie添加到Web请求中。 这是使用cookie下载字符串的function:
public static string DownloadString(string url, Encoding encoding, IDictionary cookieNameValues) { using (var webClient = new WebClient()) { var uri = new Uri(url); var webRequest = WebRequest.Create(uri); foreach(var nameValue in cookieNameValues) { webRequest.TryAddCookie(new Cookie(nameValue.Key, nameValue.Value, "/", uri.Host)); } var response = webRequest.GetResponse(); var receiveStream = response.GetResponseStream(); var readStream = new StreamReader(receiveStream, encoding); var htmlCode = readStream.ReadToEnd(); return htmlCode; } }
我们正在使用dlev答案中的代码:
public static bool TryAddCookie(this WebRequest webRequest, Cookie cookie) { HttpWebRequest httpRequest = webRequest as HttpWebRequest; if (httpRequest == null) { return false; } if (httpRequest.CookieContainer == null) { httpRequest.CookieContainer = new CookieContainer(); } httpRequest.CookieContainer.Add(cookie); return true; }
这是您使用完整代码的方式:
var cookieNameValues = new Dictionary(); cookieNameValues.Add("varName", "varValue"); var htmlResult = DownloadString(url, Encoding.UTF8, cookieNameValues);