WebClient与HttpWebRequest / HttpWebResponse

在我看来,大多数可以用HttpWebRequest/Response完成的事情也可以用WebClient类来完成。 我在某处读到WebClientWebRequest/Response的高级包装器。
到目前为止,我看不到用HttpWebRequest/Response可以完成的任何事情,而WebClient无法完成任何事情,HttpWebRequest / Response会给你更多的“细粒度”控制。

什么时候应该使用WebClient和HttpWebRequest/Response ? (显然, HttpWebRequest/Response是HTTP特定的。)

如果HttpWebRequest/Response的级别比WebClient低,那么我可以用HttpWebRequest/Response完成WebClient无法完成的工作?

使用HttpWebRequest让你更多地控制请求。 您可以设置cookie,标题,协议等等。在响应中,您也可以检索cookie和标题

HttpWebRequest公开了更多的东西,让你细粒度的协议控制,例如:是否要使用Keep-Alive,使用什么连接池,是否缓冲写入等。

WebClient不公开所有这些(尽pipe您可以从WebClient子类化并通过基础的Request对象)。

WebClient对于那些只想执行操作的情况(例如:POST / GET / Form上传)很有用,并且不能为创build和pipe理HttpWebRequestRequestStreamHttpWebResponse和响应stream而烦恼。

来自Tim Heuer博客 – http://timheuer.com/blog/archive/2008/03/14/calling-web-services-with-silverlight-2.aspx

而在Silverlight中,您将需要使用WebClient或HttpWebRequest。 有什么不同? 这是timheuer版本。 WebClient是一个更容易实现GET请求并获得响应stream的简单实现。 HttpWebRequest非常适合需要对请求进行更细粒度的控制时,需要发送标头或其他自定义。

WebClient类在用户界面线程上运行,因此在从Internet下载数据时用户界面不响应。 另一方面, HttpWebRequest类不会阻塞用户界面线程,并且您的应用程序是响应式的。 因此,在从互联网下载大量数据的应用程序中,或者数据源访问缓慢的情况下,应使用HttpWebRequest类; 在所有其他情况下,您应该使用WebClient类。

在.NET 4.5中,“HtttpWebRequest”已经过时了。 现在,这个class只是内部的。

还有一件事HttpWebrquest允许你压缩,但他Net.WebClient类不支持HTTP压缩

WebClient另一个缺点是,当您使用它获取响应文本时,它将忽略HTTP ContentTypecharset值。 您必须通过Encoding属性显式设置编码。

举一个例子:在一个请求/响应循环中发布数据并获取处理的数据对于WebClient来说似乎是不可能的,但是您可以使用HtttpWebRequest来完成。