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


178

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

谢谢。

Answers:


242

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


34
上面是事实,以下是观点:两者都很糟糕,因为HttpWebRequest已损坏。它会处理基本的身份验证错误,需要诸如之类的怪异变通办法ServicePointManager.Expect100Continue = false,做其他非标准的事情,并且有许多怪癖和特质。我启动RestSharp来帮助解决这些问题。
约翰·希恩

4
还要注意,WebClient是一个组件,因此您可以将其从VS工具窗口拖放到窗体中,并可以在其中使用它。
feroze 2011年

1
我想我前一段时间尝试将httpwebrequest与基本身份验证一起使用。我可以同意。因此,您制作了RestSharp?凉!
GurdeepS

19
像我刚刚遇到的那样遇到任何人,请注意HttpClient,.NET 4.5附带了一个新的播放器,它可能(也可能不会?)解决上述一些麻烦……
Funka,2013年

3
WebClient实现IDisposable,因此您应该考虑做using (WebClient client = new WebClient())
Eric


26

我知道回复时间太长,但只是为了将来读者了解情况而已:

Web请求

System.Object
    System.MarshalByRefObject
        System.Net.WebRequest

WebRequest是一个抽象基类。因此,您实际上并不直接使用它。您可以通过它的派生类- HttpWebRequest和使用它FileWebRequest

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

也有FileWebRequestFtpWebRequest类,inheritWebRequest。通常情况下,你会用WebRequest,好了,做一个请求,并将其转换回任HttpWebRequestFileWebRequestFtpWebRequest,取决于您的要求。下面是一个示例:

例:

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

网络客户端

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

WebClient提供对由标识的资源的通用操作sending并提供receiving数据URI。简而言之,它是的更高层次的抽象HttpWebRequest。这种“共同行动”是什么区分WebClientHttpWebRequest,如下面的示例中也显示:

例:

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

实例中还有DownloadDataDownloadFile操作WebClient。这些常用操作还简化了我们通常使用的代码HttpWebRequest。使用HttpWebRequest,我们必须获取请求的响应,实例化StreamReader以读取响应,最后将结果转换为我们期望的任何类型。有了WebClient,我们只是简单地打电话DownloadData, DownloadFile or DownloadString

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

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


WebClient类是否使用Post / Get方法..?请提供链接来描述
Kartiikeya '16

WebRequest允许我们添加请求方法类型,即具有属性METHOD的Get / Post。其中,作为WebClient没有任何方法类型添加功能。
SHEKHAR SHETE '02

1
我可以使用@SHEKHARSHETE webClient.UploadData(url, "POST", bytes)来指定方法(请参阅MSDN文档)。
杰夫·B
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.