如何选择WebClientHttpWebRequestHttpClient?

本文转载自微信公众号「码农读书」,作者码农读书。转载本文请联系码农读书公众号。

成都创新互联服务项目包括龙泉网站建设、龙泉网站制作、龙泉网页制作以及龙泉网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,龙泉网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到龙泉省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

当我们在用 .NET 调用 RestAPI 时通常有三种选择,分别为:WebClient, HttpWebRequest,HttpClient,这篇文章我们将会讨论如何使用这三种方式去调用 RestAPI,我还会提供相应的代码案例来帮助你更好的理解这三者的概念和使用方式,简单来说:

  • HttpWebRequest 是一种相对底层的处理 Http request/response 的方式。
  • WebClient 提供了对 HttpWebRequest 的高层封装,来简化使用者的调用。
  • HttpClient 是一种新的处理 Http request/response 工具包,具有更高的性能。

接下来我们讨论一下抽象类 WebRequest。

WebRequest

WebRequest 是一种基于特定的 http 实现, 它是一个抽象类, 所以在处理 Reqeust 请求时底层会根据传进来的 url 生成相应的子类,如:HttpWebRequest 或 FileWebRequest ,下面的代码展示了如何使用 WebRequest。

 
 
 
  1. WebRequest webRequest = WebRequest.Create(uri);
  2. webRequest.Credentials = CredentialCache.DefaultCredentials;
  3. webRequest.Method ="GET";
  4. HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();

WebRequest 是 .NET Framework 中第一个用来处理 Http 请求的类,在处理 Http请求和响应方面给调用者提供了诸多的灵活性,你还可以使用这个类来存取 headers, cookies, protocols 和 timeouts 等等,下面的代码展示了其实现子类 HttpWebRequest 是如何使用的。

 
 
 
  1. HttpWebRequest http = HttpWebRequest)WebRequest.Create(“http://localhost:8900/api/default”);
  2. WebResponse response = http.GetResponse();
  3. MemoryStream memoryStream = response.GetResponseStream();
  4. StreamReader streamReader = new StreamReader(memoryStream);
  5. string data = streamReader.ReadToEnd();

WebClient

WebClient 是 HttpWebRequest 的高层封装,它给调用者提供了更便捷的使用方式,理所当然做出的牺牲就是 WebClient 的性能略逊于 HttpWebRequest,如果你的业务场景只是简单访问第三方的 Http Service,那么我建议你使用 WebClient ,同理如果你有更多的精细化配置则使用 HttpWebRequest,下面的代码展示了如何使用 WebClient 。

 
 
 
  1. string data = null;
  2. using (var webClient = new WebClient())
  3. {
  4.     data = webClient.DownloadString(url);
  5. }

HttpClient

HttpClient 是在 .NET Framework 4.5 中被引入的,如果你的项目是基于 .NET 4.5 以上版本,除一些特定的原因之外,建议你优先使用 HttpClient,本质上来说,HttpClient 作为后来之物,它吸取了 HttpWebRequest 的灵活性及 WebClient 的便捷性,所以说和可兼得。

HttpWebRequest 在 request/response 对象上提供了非常精细化的配置,同时你也要注意 HttpClient 的出现并不是为了取代 WebClient,言外之意就是 HttpClient 也有缺点,比如说:不能提供 进度处理 和 URI 定制,不支持 FTP 等等,HttpClient 的优点也有很多,它所有关于 IO 操作的方法都是异步的,当然有特殊原因的话也可以使用同步方式,下面的代码展示了如何使用 HttpClient。

 
 
 
  1. public async Task GetAuthorsAsync(string uri)
  2. {
  3.     Author author = null;
  4.     HttpResponseMessage response = await client.GetAsync(uri);
  5.     if (response.IsSuccessStatusCode)
  6.     {
  7.         author = await response.Content.ReadAsAsync();
  8.     }
  9.     return author;
  10. }

值得注意的是当 response 出现错误时,默认情况下 HttpClient 并不会抛出异常,如果你一定要求 HttpClient 在这种情况下抛出异常,可更改 IsSuccessStatusCode = false 来改变这种默认行为,做法就是调用 response.EnsureSuccessStatusCode();。

 
 
 
  1. public async Task GetAuthorsAsync(string uri)
  2. {
  3.     Author author = null;
  4.     HttpResponseMessage response = await client.GetAsync(uri);
  5.     response.EnsureSuccessStatusCode();
  6.     
  7.     if (response.IsSuccessStatusCode)
  8.     {
  9.         author = await response.Content.ReadAsAsync();
  10.     }
  11.     return author;
  12. }

在项目开发中,推荐的做法是保持 HttpClient 的单例化,如果不这么做的话,每次 Request 请求实例化一次 HttpClient ,那么大量的请求必将你的 socket 耗尽并抛出 SocketException 异常。

译文链接:https://www.infoworld.com/article/3198673/when-to-use-webclient-vs-httpclient-vs-httpwebrequest.html

网页名称:如何选择WebClientHttpWebRequestHttpClient?
当前地址:http://www.36103.cn/qtweb/news23/26073.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联