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

中的 WebClientHttpWebRequest类之间有什么区别。NET?他们做的事情非常相似。事实上,为什么它们没有合并到一个类中(太多的方法/变量等可能是一个原因,但是在。NET,它打破了这个规则)。

谢谢。

183213 次浏览

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://stackoverflow.com/a/3052637/1303422

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

WebRequest

System.Object
System.MarshalByRefObject
System.Net.WebRequest

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

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

也有 FileWebRequestFtpWebRequest类,inheritWebRequest。通常,您可以使用 WebRequest来发出请求,然后根据您的请求将返回值转换为 HttpWebRequestFileWebRequestFtpWebRequest。下面是一个例子:

例如:

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

网络客户端

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

WebClient提供对 sendingreceiving数据的通用操作,这些数据来自由 URI标识的资源。简单地说,它是 HttpWebRequest的一个更高级的抽象。这种“常见操作”是 WebClientHttpWebRequest的区别所在,如下面的示例所示:

例如:

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

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

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

注意: < em > 基本上“与 WebRequest相比,网络客户端只需要几行代码”