.NET中的WebClient和HTTPWebRequest类有什么区别?

WebClient和.NET中的HttpWebRequest类有什么不同? 他们都做了非常相似的事情。 实际上,为什么不把它们合并到一个类中(太多的方法/variables等可能是其中一个原因,但是.NET中有其他类违反了这个规则)。

谢谢。

WebClient是基于HttpWebRequest构build的更高级别的抽象,用于简化最常见的任务。 例如,如果您想从HttpWebResponse中获取内容,则必须从响应stream中读取:

 var http = (HttpWebRequest)WebRequest.Create("http://example.com"); var response = http.GetResponse(); var stream = response.GetResponseStream(); var sr = new StreamReader(stream); var content = sr.ReadToEnd(); 

使用WebClient,您只需执行DownloadString

 var client = new WebClient(); var content = client.DownloadString("http://example.com"); 

注意:为了简洁,我省略了两个示例中的using语句。 你一定要小心妥善处理你的Web请求对象。

一般来说,WebClient对于简单的请求很快而且很脏,而HttpWebRequest对于需要对整个请求进行更多的控制的时候非常有用。

我知道回复的时间太长,但只是作为未来读者的信息目的:

的WebRequest

 System.Object System.MarshalByRefObject System.Net.WebRequest 

WebRequest是一个抽象的基类。 所以你实际上不直接使用它。 你通过它派生类使用它 – HttpWebRequestFileWebRequest

您可以使用WebRequest Create方法来创buildWebRequest一个实例。 GetResponseStream返回data stream

还有从WebRequest inherit FileWebRequestFtpWebRequest类。 通常情况下,您将使用WebRequest来完成请求,并根据您的请求将返回值转换为HttpWebRequestFileWebRequestFtpWebRequest 。 下面是一个例子:

例:

 var _request = (HttpWebRequest)WebRequest.Create("http://stackverflow.com"); var _response = (HttpWebResponse)_request.GetResponse(); 

Web客户端

 System.Object System.MarshalByRefObject System.ComponentModel.Component System.Net.WebClient 

WebClient提供通用操作来sendingreceiving来自URI标识的资源的数据。 简而言之,这是HttpWebRequest的更高层次的抽象。 这个“常用操作”就是将WebClientHttpWebRequest分开来,如下面的示例所示:

例:

 var _client = new WebClient(); var _stackContent = _client.DownloadString("http://stackverflow.com"); 

WebClient实例下还有DownloadDataDownloadFile操作。 这些常见的操作也简化了我们通常对HttpWebRequest所做的代码。 使用HttpWebRequest ,我们必须得到我们请求的响应,实例化StreamReader来读取响应,最后将结果转换为我们期望的types。 使用WebClient ,我们只需简单地调用DownloadData, DownloadFile or DownloadString

但是请记住, WebClient.DownloadString不考虑您请求的资源的encoding 。 所以,如果你不指定和编码,你最终可能会收到奇怪的字符。

注意: 基本上“ WebClientWebrequest相比需要几行代码”

另外WebClient没有超时属性。 这就是问题所在,因为默认值是100秒,这太多了,表示没有Internet连接。

该问题的解决方法是在这里https://stackoverflow.com/a/3052637/1303422