首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在WebClient类中使用CookieContainer

在WebClient类中使用CookieContainer
EN

Stack Overflow用户
提问于 2009-11-22 07:55:59
回答 5查看 150.7K关注 0票数 155

我以前将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;
    }
}

这是最好的方法吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-11-22 08:08:34

是。我的意思是,重写GetWebRequest()是解决WebClient有限功能的最佳方案。在我知道这个选项之前,我在HttpWebRequest层写了很多非常痛苦的代码,因为WebClient几乎(但不完全)做了我需要的事情。派生要容易得多。

另一种选择是使用常规的WebClient类,但是在发出请求之前手动填充Cookie头,然后在响应上拉出Set- Cookie头。CookieContainer类上有一些帮助程序方法,可以使创建和解析这些头文件变得更容易:分别是CookieContainer.SetCookies()CookieContainer.GetCookieHeader()

我更喜欢前一种方法,因为它对调用者来说更容易,并且比第二种方法需要更少的重复代码。此外,派生方法对于多个可扩展性场景(例如cookies、代理等)也是以相同的方式工作的。

票数 69
EN

Stack Overflow用户

发布于 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");
票数 128
EN

Stack Overflow用户

发布于 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);
        }
    }
}
票数 47
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1777221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档