在.NET中,WebClient
类和HttpWebRequest
类有什么不同?它们都可以完成非常相似的功能。实际上,为什么它们没有被合并成一个类呢?(可能是因为方法和变量太多了,但是在.NET中还有其他类也违反了这个规则)。
谢谢。
在.NET中,WebClient
类和HttpWebRequest
类有什么不同?它们都可以完成非常相似的功能。实际上,为什么它们没有被合并成一个类呢?(可能是因为方法和变量太多了,但是在.NET中还有其他类也违反了这个规则)。
谢谢。
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则适用于当您需要对整个请求进行更多控制时。
WebClient没有超时属性,这是个问题,因为默认值为100秒,如果没有网络连接,这太长了。
解决这个问题的方法在这里 https://dev59.com/Y3RB5IYBdhLWcg3wgXdV#3052637
我知道回复太晚了,但是出于对未来读者的信息目的:
WebRequest(网络请求)
System.Object
System.MarshalByRefObject
System.Net.WebRequest
WebRequest
是一个抽象的基类,因此您实际上不会直接使用它。您将通过其派生类HttpWebRequest
和FileWebRequest
来使用它。
您可以使用WebRequest
的Create方法创建WebRequest
实例。 GetResponseStream
返回数据流
。
还有FileWebRequest
和FtpWebRequest
类继承自WebRequest
。通常,您会使用WebRequest
来发出请求,并根据您的请求将返回转换为HttpWebRequest
、FileWebRequest
或FtpWebRequest
。以下是一个例子:
示例:
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
实例下也有 DownloadData
和 DownloadFile
操作。这些常见操作可以简化我们通常使用 HttpWebRequest
时所需的代码。使用 HttpWebRequest
,我们必须获取请求的响应,实例化 StreamReader
来读取响应,最后将结果转换为我们期望的任何类型。而使用 WebClient
,我们只需要简单地调用 DownloadData、DownloadFile 或 DownloadString
。
然而,请记住,WebClient.DownloadString
不考虑您请求的资源的编码。因此,如果您没有指定编码,您可能会收到奇怪的字符。
注意: 基本上"WebClient 的代码行数比 WebRequest 少"
ServicePointManager.Expect100Continue = false
,还有许多怪癖和特殊情况。我创建了RestSharp来帮助解决这些问题并使其更加顺畅。 - John SheehanHttpClient
的新工具出现在 .NET 4.5 中,它可能(或者可能不会?)解决上述的某些问题...... - Funkausing (WebClient client = new WebClient())
。 - EricWebClient
和HttpWebRequest
是 _legacy_,而不是 _deprecated_。 - user1451111