WebClient与HttpWebRequest / HttpWebResponse


132

在我看来,大多数可以完成的事情HttpWebRequest/Response也可以在WebClient课堂上完成。我在某处阅读WebClient了高级包装WebRequest/Response
到目前为止,我看不到任何可以与完成HttpWebRequest/Response不能用完成WebClient,也没有在那里的HttpWebRequest /响应会给你更多的“细粒度”控制。

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

如果HttpWebRequest/Response是较低的水平WebClientHttpWebRequest/Response那我不能完成的任务是WebClient什么?

Answers:


87

使用HttpWebRequest可以对请求进行更多控制。您可以设置Cookie,标头,协议等。在响应中,您还可以检索Cookie和标头


14
Thomas,仍然不相信... WebClient具有Headers属性,您可以像这样检索cookie:字符串cookie = webClient.ResponseHeaders(“ Set-Cookie”)并将其设置为:webClient.Headers.Add(“ Cookie”,“ CommunityServer-UserCookie ...“);

14
使用HttpWebRequest可以定义超时。在WebClient中,这是不可能的。
ripper234'2010-11-11

14
@ ripper234,实际上可能:您只需要继承WebClient并重写GetWebRequest即可自定义HttpWebRequest
Thomas Levesque 2010年

15
@ThomasLevesque如果您要继承webclient并覆盖webrequest,则使用webclient似乎毫无意义...
Hagai L 2012年

5
@HagaiL,我不同意...您不必手动创建整个请求,可以使用base.GetWebRequest它来创建它,然后自定义所需的内容
Thomas Levesque 2012年

54

HttpWebRequest 公开了很多东西,使您可以进行精细的协议控制,例如:是否要使用Keep-Alive,要使用的连接池,是否要缓冲写操作等。

WebClient不会公开所有这些内容(尽管您可以从WebClient基础Request对象中继承并对其进行访问)。

WebClient是,你只想做一个操作的情况下非常有用(如:POST / GET /表格上传),并不能费心去创建和管理HttpWebRequestRequestStreamHttpWebResponse,和响应流。


13
另外,还有一件事我忘了提及。WebClient是Component对象,而HttpWebRequest不是。那是什么意思?好吧,如果您使用VisualStudio构建GUI应用程序,则可以在表单上拖放WebClient组件,并使用它向HTTP / FTP等服务器发出请求。
feroze

14

从蒂姆·豪雅(Tim Heuer)的博客-http://timheuer.com/blog/archive/2008/03/14/calling-web-services-with-silverlight-2.aspx

相反,在Silverlight中,您将要使用WebClient或HttpWebRequest。有什么不同?这是调音台的版本。WebClient是一个更简单的实现,可以非常轻松地执行GET请求并获得响应流。HttpWebRequest非常适用于需要对请求进行更细粒度的控制,需要发送标头或其他自定义项的情况。


7
WebClient还允许使用UploadString,UploadData和UploadFile进行POST
Thomas Levesque,2009年

@ThomasLevesque今天有更新的类吗?我看到这个讨论有些
陈旧了

@KonradViltersten,我认为WebClient类没有太大变化。对于新应用程序,我建议您改用HttpClient,它也非常易于使用并且更加灵活。
Thomas Levesque 2015年

1
@ThomasLevesque对,是我正在考虑的那个。我回想起http是类名的区别,并被Http误导了。现在,我回到了正确的轨道。谢谢!
Konrad Viltersten 2015年

12

Web客户端上的用户界面线程类运行,所以当数据从互联网上下载的用户界面没有响应。另一方面,HttpWebRequest类不会阻止用户界面线程,并且您的应用程序具有响应能力。因此,在要从Internet下载大量数据的应用程序中,或者如果数据源访问速度较慢的应用程序中,则应使用HttpWebRequest类。在所有其他情况下,应使用WebClient类。


1
WP7则相反。HttpWebRequest封送回Mango中的UI线程,这使我现在没有悲伤的尽头。Grrr
Cameron MacFarland

6
WebClient也支持异步方法。
Cyber​​Monk

6

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


这是个好的观点; 这不仅是设置Encoding-您在请求之后才知道编码的问题,因此WebClient api极不可能使您能够正确下载未知编码的字符串。
Eamon Nerbonne


5

在.NET 4.5中,“ HtttpWebRequest”已过时。现在,此类仅是内部的。


2
确实。使用WebRequest代替。
Silkfire

2
该类不是过时的,构造函数是过时的。这个班级不是内部的,它仍然是公共的。
user247702

2

一个示例:使用WebClient似乎不可能在一个请求/响应周期中发布数据并取回经过处理的数据,但是您可以使用HtttpWebRequest做到这一点。


2
只需使用WebClient.UploadString或WebClient.UploadData来执行POST并获取响应字符串或字节数组。
samjudson 2011年

2
为了明确起见,UploadString的返回值是一个字符串,而UploadData方法的返回值是一个字节数组。
诺曼H
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.