我以前将CookieContainer与HttpWebRequest和HttpWebResponse会话一起使用,但现在,我想将其与WebClient一起使用。据我所知,没有像HttpWebRequests (request.CookieContainer
)那样的内置方法。如何从CookieContainer中的WebClient收集cookies?
我对此执行googled并找到了the following sample
public class CookieAwareWebClient : WebClient
{
private readonly CookieContainer m_container = new CookieContainer();
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest request = base.GetWebRequest(address);
HttpWebRequest webRequest = request as HttpWebRequest;
if (webRequest != null)
{
webRequest.CookieContainer = m_container;
}
return request;
}
}
这是最好的方法吗?
发布于 2009-11-22 08:08:34
是。我的意思是,重写GetWebRequest()是解决WebClient有限功能的最佳方案。在我知道这个选项之前,我在HttpWebRequest层写了很多非常痛苦的代码,因为WebClient几乎(但不完全)做了我需要的事情。派生要容易得多。
另一种选择是使用常规的WebClient类,但是在发出请求之前手动填充Cookie头,然后在响应上拉出Set- Cookie头。CookieContainer类上有一些帮助程序方法,可以使创建和解析这些头文件变得更容易:分别是CookieContainer.SetCookies()
和CookieContainer.GetCookieHeader()
。
我更喜欢前一种方法,因为它对调用者来说更容易,并且比第二种方法需要更少的重复代码。此外,派生方法对于多个可扩展性场景(例如cookies、代理等)也是以相同的方式工作的。
发布于 2011-10-23 02:30:34
WebClient wb = new WebClient();
wb.Headers.Add(HttpRequestHeader.Cookie, "somecookie");
来自评论的
如何格式化cookie的名称和值来代替"somecookie“?
wb.Headers.Add(HttpRequestHeader.Cookie, "cookiename=cookievalue");
对于多个cookies:
wb.Headers.Add(HttpRequestHeader.Cookie,
"cookiename1=cookievalue1;" +
"cookiename2=cookievalue2");
发布于 2012-07-17 21:45:14
这篇文章只是你找到的文章的延伸。
public class WebClientEx : WebClient
{
public WebClientEx(CookieContainer container)
{
this.container = container;
}
public CookieContainer CookieContainer
{
get { return container; }
set { container= value; }
}
private CookieContainer container = new CookieContainer();
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest r = base.GetWebRequest(address);
var request = r as HttpWebRequest;
if (request != null)
{
request.CookieContainer = container;
}
return r;
}
protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result)
{
WebResponse response = base.GetWebResponse(request, result);
ReadCookies(response);
return response;
}
protected override WebResponse GetWebResponse(WebRequest request)
{
WebResponse response = base.GetWebResponse(request);
ReadCookies(response);
return response;
}
private void ReadCookies(WebResponse r)
{
var response = r as HttpWebResponse;
if (response != null)
{
CookieCollection cookies = response.Cookies;
container.Add(cookies);
}
}
}
https://stackoverflow.com/questions/1777221
复制相似问题