.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 中的WebClient
和HttpWebRequest
类之间有什么区别?他们都做非常相似的事情。事实上,为什么不将它们合并到一个类中(方法/变量等太多可能是原因之一,但 .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 稍微更正一下:您链接的答案提到 WebClient
和 HttpWebRequest
作为legacy,而不是deprecated。【参考方案2】:
WebClient 也没有超时属性。这就是问题所在,因为默认值是 100 秒,如果没有 Internet 连接,这个值就太大了。
该问题的解决方法在这里https://***.com/a/3052637/1303422
【讨论】:
问题是有什么区别。区别之一是 WebClient 没有超时属性,而 HttpWebRequest 有。【参考方案3】:我知道它的回复时间太长了,但这只是为了给未来的读者提供信息:
网络请求
System.Object
System.MarshalByRefObject
System.Net.WebRequest
WebRequest
是一个抽象基类。所以你实际上并不直接使用它。您可以通过它的派生类使用它 - HttpWebRequest
和 FileWebRequest
。
您使用 WebRequest
的 Create 方法来创建 WebRequest
的实例。 GetResponseStream
返回data stream
。
还有FileWebRequest
和FtpWebRequest
类,inherit
来自WebRequest
。通常,您会使用WebRequest
来发出请求并将返回转换为HttpWebRequest
、FileWebRequest
或FtpWebRequest
,具体取决于您的请求。下面是一个例子:
示例:
var _request = (HttpWebRequest)WebRequest.Create("http://***.com");
var _response = (HttpWebResponse)_request.GetResponse();
网络客户端
System.Object
System.MarshalByRefObject
System.ComponentModel.Component
System.Net.WebClient
WebClient
为来自URI
标识的资源中的sending
和receiving
数据提供通用操作。简单地说,它是HttpWebRequest
的更高层次的抽象。这种“通用操作”是 WebClient
与 HttpWebRequest
的区别所在,如下面的示例所示:
示例:
var _client = new WebClient();
var _stackContent = _client.DownloadString("http://***.com");
WebClient
实例下还有DownloadData
和DownloadFile
操作。这些常见操作还简化了我们通常使用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