WebClient, HttpClient, HttpWebRequest

本文对比了.NET中HttpWebRequest、WebClient和HttpClient三种HTTP请求处理方式的特点和适用场景。HttpWebRequest提供底层控制,WebClient简化常见任务,HttpClient适用于多次请求且支持异步。

HttpWebRequest

这是.NET创建者最初开发用于使用HTTP请求的标准类。使用HttpWebRequest可以让开发者控制请求/响应流程的各个方面,如 timeouts, cookies, headers, protocols。另一个好处是HttpWebRequest类不会阻塞UI线程。例如,当您从响应很慢的API服务器下载大文件时,您的应用程序的UI不会停止响应。HttpWebRequest通常和WebResponse一起使用,一个发送请求,一个获取数据。HttpWebRquest更为底层一些,能够对整个访问过程有个直观的认识,但同时也更加复杂一些。以GET请求为例,至少需要五行代码才能够实现。

HttpWebRequest http = (HttpWebRequest)WebRequest.Create("http://example.com");
                WebResponse response = http.GetResponse();
                Stream stream = response.GetResponseStream();
                using (var streamtemn = File.Create("路径"))
                {
                    stream.CopyTo(streamtemn);
                }

这种方法是早期开发者使用的方法,在当前业务中已经很少使用,由于其更加底层,需要处理一些细节,最多可用于框架内部操作。

 WebClient

WebClient是一种更高级别的抽象,是HttpWebRequest为了简化最常见任务而创建的,使用过程中你会发现他缺少基本的header,timeoust的设置,不过这些可以通过继承httpwebrequest来实现。相对来说,WebClient比WebRequest更加简单,它相当于封装了request和response方法,不过需要说明的是,Webclient和WebRequest继承的是不同类,两者在继承上没有任何关系。

使用WebClient可能比HttpWebRequest直接使用更慢(大约几毫秒),但却更为简单,减少了很多细节,代码量也比较少,比如下载文件的代码,只需要两行。

using (WebClient webClient = new WebClient())
                {
                    webClient.DownloadFile("http://example.com", "路径");
                }

WebClient主要面向了WEB网页场景,在模拟Web操作时使用较为方便,但用在RestFul场景下却比较麻烦,这时候就需要HttpClient出马了。

HttpClient

目前业务上使用的比较多的是HttpClient,它适合用于多次请求操作,一般设置好默认头部后,可以进行重复多次的请求,基本上用一个实例可以提交任何的HTTP请求。此外,HttpClient提供了异步支持,可以轻松配合async await 实现异步请求。

下表是三者一些区别

 HttpWebRequsetWebClientHttpClient
命名空间System.NetSystem.NetSystem.Net.Http
继承类WebRequestComponentHttpMessageInvoker
支持url转向
支持cookie和session
支持用户代理服务器
使用复杂度

参考材料:

https://stackoverflow.com/questions/22791376/is-httpwebrequest-or-webclient-faster/22792326#22792326

https://blog.youkuaiyun.com/XuWei_XuWei/article/details/18861353

https://stackoverflow.com/questions/22214930/httpclient-vs-httpwebrequest

### 不同 HTTP 客户端库的用法对比 #### WebClient 类 `WebClient` 是一种简单易用的方式来进行网络操作。它提供了用于上传和下载数据的方法,适用于基本场景。 ```csharp using System; using System.Net; class Program { static void Main(string[] args) { WebClient client = new WebClient(); string data = client.DownloadString("http://example.com"); Console.WriteLine(data); } } ``` 此方法适合简单的 GET 和 POST 请求[^1]。 #### HttpClient 类 `HttpClient` 提供更灵活的功能集来发送 HTTP 请求并接收响应。推荐在现代应用程序中使用 `HttpClient` 而不是较旧的类如 `HttpWebRequest` 或者 `WebClient` 。该类支持异步编程模式,并且可以配置默认请求头和其他设置。 ```csharp using System; using System.Net.Http; using System.Threading.Tasks; class Program { static async Task Main(string[] args) { using (var httpClient = new HttpClient()) { var response = await httpClient.GetAsync("http://example.com"); if (response.IsSuccessStatusCode) { var content = await response.Content.ReadAsStringAsync(); Console.WriteLine(content); } } } } ``` 对于长期运行的应用程序和服务来说,应该重用同一个 `HttpClient` 实例而不是每次创建新的实例[^2]。 #### HttpWebRequest 类 `HttpWebRequest` 属于较低级别的 API ,允许开发者对 Web 请求有更多控制权。然而,在大多数情况下并不需要这种程度上的定制化;因此通常建议优先考虑更高层次抽象的替代方案比如 `HttpClient` 。 ```csharp using System; using System.IO; using System.Net; class Program { static void Main(string[] args) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://example.com/"); request.Method = "GET"; using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) using (Stream stream = response.GetResponseStream()) using (StreamReader reader = new StreamReader(stream)) { string result = reader.ReadToEnd(); Console.WriteLine(result); } } } ``` 尽管如此,当确实遇到特殊情况时——例如某些特定类型的认证机制或者其他高级功能需求,则可能仍然需要用到这个类[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值