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

185

在.NET中,WebClient类和HttpWebRequest类有什么不同?它们都可以完成非常相似的功能。实际上,为什么它们没有被合并成一个类呢?(可能是因为方法和变量太多了,但是在.NET中还有其他类也违反了这个规则)。

谢谢。

3个回答

246

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则适用于当您需要对整个请求进行更多控制时。


36
以上是事实,以下是观点:两者都很糟糕,因为HttpWebRequest存在问题。它处理基本授权的方式不正确,需要奇怪的解决方法,比如 ServicePointManager.Expect100Continue = false,还有许多怪癖和特殊情况。我创建了RestSharp来帮助解决这些问题并使其更加顺畅。 - John Sheehan
4
请注意WebClient是一个组件,因此您可以从VS工具窗口将其拖放到表单中并在那里使用它。请注意不要改变原来的意思。 - feroze
19
如果有人跟我一样刚刚看到这个,注意现在有一个叫做 HttpClient 的新工具出现在 .NET 4.5 中,它可能(或者可能不会?)解决上述的某些问题...... - Funka
3
WebClient 实现了 IDisposable 接口,因此你应该考虑使用 using (WebClient client = new WebClient()) - Eric
2
@user3613932 有一个小修正:你链接的答案提到 WebClientHttpWebRequest 是 _legacy_,而不是 _deprecated_。 - user1451111
显示剩余3条评论

33

17
问:有什么区别?其中一个区别是WebClient没有超时属性,而HttpWebRequest有。 - Andriy F.

27

我知道回复太晚了,但是出于对未来读者的信息目的:

WebRequest(网络请求)

System.Object
    System.MarshalByRefObject
        System.Net.WebRequest

WebRequest是一个抽象的基类,因此您实际上不会直接使用它。您将通过其派生类HttpWebRequestFileWebRequest来使用它。

您可以使用WebRequest的Create方法创建WebRequest实例。 GetResponseStream返回数据流

还有FileWebRequestFtpWebRequest类继承自WebRequest。通常,您会使用WebRequest来发出请求,并根据您的请求将返回转换为HttpWebRequestFileWebRequestFtpWebRequest。以下是一个例子:

示例:

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

WebClient

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

WebClient 提供了常用的操作,可以从由 URI 标识的资源中发送和接收数据。简单来说,它是 HttpWebRequest 的更高级抽象。正如下面的示例所示,这个“常见的操作”是区别于 HttpWebRequest 的特点:

示例:

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

WebClient 实例下也有 DownloadDataDownloadFile 操作。这些常见操作可以简化我们通常使用 HttpWebRequest 时所需的代码。使用 HttpWebRequest,我们必须获取请求的响应,实例化 StreamReader 来读取响应,最后将结果转换为我们期望的任何类型。而使用 WebClient,我们只需要简单地调用 DownloadData、DownloadFile 或 DownloadString

然而,请记住,WebClient.DownloadString 不考虑您请求的资源的编码。因此,如果您没有指定编码,您可能会收到奇怪的字符。

注意: 基本上"WebClient 的代码行数比 WebRequest 少"


WebClient类使用Post/Get方法吗?请提供一个链接来描述。 - Kartiikeya
WebRequest允许我们通过METHOD属性添加请求方法类型,例如Get / Post,而WebClient没有任何添加方法类型的功能。 - SHEKHAR SHETE
1
@SHEKHARSHETE 我能够使用 webClient.UploadData(url, "POST", bytes) 来指定方法(请参阅 MSDN 文档)。 - Jeff B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接