一尘不染

将CookieContainer与WebClient类一起使用

c#

我以前在CookieHttpContainer和HttpWebRequest和HttpWebResponse会话中使用过,但是现在,我想在WebClient中使用它。据我了解,没有像HttpWebRequests(request.CookieContainer)那样的内置方法。
如何在CookieContainer中从WebClient收集cookie?

我对此进行了搜索,发现了以下示例

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;
    }
}

这是最好的方法吗?


阅读 375

收藏
2020-05-19

共1个答案

一尘不染

是。恕我直言,覆盖GetWebRequest()是WebClient有限功能的最佳解决方案。在我知道此选项之前,我在HttpWebRequest层上编写了许多非常痛苦的代码,因为WebClient几乎(但不是完全)完成了我需要的工作。推导要容易得多。

另一种选择是使用常规WebClient类,但在发出请求之前手动填充Cookie头,然后在响应上拉出Set-
Cookies头。CookieContainer类上有一些辅助方法,这些方法使创建和解析这些标头更加容易:CookieContainer.SetCookies()CookieContainer.GetCookieHeader()

我喜欢前一种方法,因为它比第二种方法更容易调用,并且所需的重复代码更少。同样,派生方法对于多种可扩展性方案(例如cookie,代理等)也以相同的方式工作。

2020-05-19