.NET中的WebClient和HTTPWebRequest类有什么区别?
WebClient
和.NET中的HttpWebRequest
类有什么不同? 他们都做了非常相似的事情。 实际上,为什么不把它们合并到一个类中(太多的方法/variables等可能是其中一个原因,但是.NET中有其他类违反了这个规则)。
谢谢。
WebClient是基于HttpWebRequest构build的更高级别的抽象,用于简化最常见的任务。 例如,如果您想从HttpWebResponse中获取内容,则必须从响应stream中读取:
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对于需要对整个请求进行更多的控制的时候非常有用。
我知道回复的时间太长,但只是作为未来读者的信息目的:
的WebRequest
System.Object System.MarshalByRefObject System.Net.WebRequest
WebRequest
是一个抽象的基类。 所以你实际上不直接使用它。 你通过它派生类使用它 – HttpWebRequest
和FileWebRequest
。
您可以使用WebRequest
Create方法来创buildWebRequest
一个实例。 GetResponseStream
返回data stream
。
还有从WebRequest
inherit
FileWebRequest
和FtpWebRequest
类。 通常情况下,您将使用WebRequest
来完成请求,并根据您的请求将返回值转换为HttpWebRequest
, FileWebRequest
或FtpWebRequest
。 下面是一个例子:
例:
var _request = (HttpWebRequest)WebRequest.Create("http://stackverflow.com"); var _response = (HttpWebResponse)_request.GetResponse();
Web客户端
System.Object System.MarshalByRefObject System.ComponentModel.Component System.Net.WebClient
WebClient
提供通用操作来sending
和receiving
来自URI
标识的资源的数据。 简而言之,这是HttpWebRequest
的更高层次的抽象。 这个“常用操作”就是将WebClient
与HttpWebRequest
分开来,如下面的示例所示:
例:
var _client = new WebClient(); var _stackContent = _client.DownloadString("http://stackverflow.com");
在WebClient
实例下还有DownloadData
和DownloadFile
操作。 这些常见的操作也简化了我们通常对HttpWebRequest
所做的代码。 使用HttpWebRequest
,我们必须得到我们请求的响应,实例化StreamReader
来读取响应,最后将结果转换为我们期望的types。 使用WebClient
,我们只需简单地调用DownloadData, DownloadFile or DownloadString
。
但是请记住, WebClient.DownloadString
不考虑您请求的资源的encoding
。 所以,如果你不指定和编码,你最终可能会收到奇怪的字符。
注意: 基本上“ WebClient与Webrequest相比需要几行代码”
另外WebClient没有超时属性。 这就是问题所在,因为默认值是100秒,这太多了,表示没有Internet连接。
该问题的解决方法是在这里https://stackoverflow.com/a/3052637/1303422