我以前在CookieHttpContainer和HttpWebRequest和HttpWebResponse会话中使用过,但是现在,我想在WebClient中使用它。据我了解,没有像HttpWebRequests(request.CookieContainer)那样的内置方法。 如何在CookieContainer中从WebClient收集cookie?
request.CookieContainer
我对此进行了搜索,发现了以下示例:
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; } }
这是最好的方法吗?
是。恕我直言,覆盖GetWebRequest()是WebClient有限功能的最佳解决方案。在我知道此选项之前,我在HttpWebRequest层上编写了许多非常痛苦的代码,因为WebClient几乎(但不是完全)完成了我需要的工作。推导要容易得多。
另一种选择是使用常规WebClient类,但在发出请求之前手动填充Cookie头,然后在响应上拉出Set- Cookies头。CookieContainer类上有一些辅助方法,这些方法使创建和解析这些标头更加容易:CookieContainer.SetCookies()和CookieContainer.GetCookieHeader()。
CookieContainer.SetCookies()
CookieContainer.GetCookieHeader()
我喜欢前一种方法,因为它比第二种方法更容易调用,并且所需的重复代码更少。同样,派生方法对于多种可扩展性方案(例如cookie,代理等)也以相同的方式工作。