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

时间:2011-02-14 02:16:30

标签: c# .net httpwebrequest webclient

.NET中的WebClientHttpWebRequest类之间有什么区别?他们都做了非常相似的事情。实际上,为什么不将它们合并为一个类(太多的方法/变量等可能是一个原因,但.NET中有其他类违反了该规则)。

感谢。

3 个答案:

答案 0 :(得分:234)

WebClient是一种基于HttpWebRequest构建的高级抽象,可简化最常见的任务。例如,如果要从HttpWebResponse中获取内容,则必须从响应流中读取:

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很有用。

答案 1 :(得分:29)

WebClient也没有超时属性。这就是问题所在,因为dafault值是100秒,这太多了,无法表明是否没有互联网连接。

此问题的解决方法是https://stackoverflow.com/a/3052637/1303422

答案 2 :(得分:24)

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

<强>的WebRequest

System.Object
    System.MarshalByRefObject
        System.Net.WebRequest

WebRequest是一个抽象基类。所以你实际上并没有直接使用它。您可以通过它派生类使用它 - HttpWebRequestFileWebRequest

您使用WebRequest的创建方法来创建WebRequest的实例。 GetResponseStream返回data stream

还有来自FileWebRequest FtpWebRequest的{​​{1}}和inherit个班级。通常情况下,您可以使用WebRequest来提出请求并将回复转换为WebRequestHttpWebRequestFileWebRequest,具体取决于您的请求。以下是一个例子:

示例:

FtpWebRequest

<强> Web客户端

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

System.Object System.MarshalByRefObject System.ComponentModel.Component System.Net.WebClient 为来自WebClient标识的资源的sendingreceiving数据提供常见操作。简单来说,它是URI的更高级抽象。这种“常见操作”将HttpWebRequestWebClient区分开来,如下例所示:

示例:

HttpWebRequest

var _client = new WebClient(); var _stackContent = _client.DownloadString("http://stackverflow.com"); 个实例下还有DownloadDataDownloadFile个操作。这些常见操作还简化了我们通常使用WebClient执行操作的代码。使用HttpWebRequest,我们必须获得请求的响应,实例化HttpWebRequest以读取响应,最后将结果转换为我们期望的任何类型。使用StreamReader,我们只需致电WebClient

但请注意,DownloadData, DownloadFile or DownloadString不会考虑您请求的资源的WebClient.DownloadString。因此,如果您没有指定和编码,最终可能会收到奇怪的字符。

注意: 基本上&#34; WebClient Webrequest &#34;