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

Posted

技术标签:

【中文标题】.NET 中的 WebClient 和 HTTPWebRequest 类有啥区别?【英文标题】:What difference is there between WebClient and HTTPWebRequest classes in .NET?.NET 中的 WebClient 和 HTTPWebRequest 类有什么区别? 【发布时间】:2011-02-14 02:16:29 【问题描述】:

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

谢谢。

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是事实,以下是观点:两者都很糟糕,因为 HttpWebRequest 被破坏了。它处理基本的身份验证错误,需要像ServicePointManager.Expect100Continue = false 这样的奇怪解决方法,做其他非标准的事情并且有许多怪癖和特质。我开始使用 RestSharp 来帮助解决这些问题。 另请注意,WebClient 是一个组件,因此您可以将其从 VS 工具窗口拖放到您的表单中,并能够在那里使用它。 任何人都像我刚才一样遇到过这种情况,请注意有一个名为HttpClient 的新玩家在.NET 4.5 中可能(或可能不会?)解决上述一些问题麻烦... WebClient 实现了 IDisposable,所以你应该考虑做using (WebClient client = new WebClient()) @user3613932 稍微更正一下:您链接的答案提到 WebClientHttpWebRequest 作为legacy,而不是deprecated【参考方案2】:

WebClient 也没有超时属性。这就是问题所在,因为默认值是 100 秒,如果没有 Internet 连接,这个值就太大了。

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

【讨论】:

问题是有什么区别。区别之一是 WebClient 没有超时属性,而 HttpWebRequest 有。【参考方案3】:

我知道它的回复时间太长了,但这只是为了给未来的读者提供信息:

网络请求

System.Object
    System.MarshalByRefObject
        System.Net.WebRequest

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

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

还有FileWebRequestFtpWebRequest 类,inherit 来自WebRequest。通常,您会使用WebRequest 来发出请求并将返回转换为HttpWebRequestFileWebRequestFtpWebRequest,具体取决于您的请求。下面是一个例子:

示例:

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

网络客户端

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

WebClient 为来自URI 标识的资源中的sendingreceiving 数据提供通用操作。简单地说,它是HttpWebRequest 的更高层次的抽象。这种“通用操作”是 WebClientHttpWebRequest 的区别所在,如下面的示例所示:

示例:

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

WebClient 实例下还有DownloadDataDownloadFile 操作。这些常见操作还简化了我们通常使用HttpWebRequest 执行的代码。使用HttpWebRequest,我们必须获得请求的响应,实例化StreamReader 以读取响应,最后将结果转换为我们期望的任何类型。对于WebClient,我们只需调用DownloadData, DownloadFile or DownloadString

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

注意: WebRequest 相比,基本上“WebClient 只需要几行代码”

【讨论】:

WebClient 类是否使用 Post/Get 方法 ..?请提供一个链接来描述 WebRequest 允许我们添加请求方法类型,即带有属性 METHOD 的 Get/Post。其中 WebClient 没有任何 Method 类型添加功能。 @SHEKHARSHETE 我可以使用webClient.UploadData(url, "POST", bytes) 指定方法(请参阅MSDN docs)。

以上是关于.NET 中的 WebClient 和 HTTPWebRequest 类有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

powershell 使用System.Net命名空间中的WebClient类的DownloadFile方法下载文件

C++/WinAPI 中的 .NET WebClient.DownloadData(url) 替代方案?

WebClient、HttpWebRequest 和 HttpClient 的最大并发请求数

使用 .NET WebClient 模拟 XmlHttpRequest

如何在 .NET 6 中用 HttpClient 替换过时的 WebClient

如何将 WebClient 与 .Net Core 一起使用?