如何选择 WebClient HttpWebRequest HttpClient ?

当我们在用 .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。


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

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


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

WebClient

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


string data = null;using (var webClient = new WebClient())
{data = webClient.DownloadString(url);
}

HttpClient

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

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


public async Task<Author> GetAuthorsAsync(string uri)
{Author author = null;HttpResponseMessage response = await client.GetAsync(uri);if (response.IsSuccessStatusCode){author = await response.Content.ReadAsAsync<Author>();}return author;
}

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


public async Task<Author> GetAuthorsAsync(string uri)
{Author author = null;HttpResponseMessage response = await client.GetAsync(uri);response.EnsureSuccessStatusCode();if (response.IsSuccessStatusCode){author = await response.Content.ReadAsAsync<Author>();}return author;
}

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304229.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gre考试能用计算机么,新GRE考试必须知道的九大考场问题

参加GRE考试须知GRE考场问题1、计算机化GRE考试考场的环境怎样?计算机化考场按照全球统一标准建设&#xff0c;温度适宜&#xff0c;光线充足&#xff0c;隔音效果良好。各个考位由屏风分隔&#xff0c;相对独立。GRE考试须知GRE考场问题2、参加计算机化GRE考试需要携带什么文…

python property setter_Python:动态属性 property setter 以及 __getattr__ 属性

1. property引言&#xff1a;-- 假设有这样一个需求&#xff0c;我们需要创建一个 User 类&#xff0c;并初始化 birthday 参数&#xff0c;之后根据 birthday 计算得到年龄&#xff1b;-- 我们设计下面的代码实现该需求&#xff1a;>>> from datetime import date, d…

机器学习三部曲

随着科技的发展&#xff0c;计算机对人类的生产活动和社会活动产生了极为重要的影响&#xff0c;同时以强大的生命力飞速发展着。目前计算机正广泛用于社会各个领域&#xff0c;并朝着微型化、网络化、智能化和巨型化的方向前进。说到智能化&#xff0c;大家最先想到的应该就是…

AntDesign Pro + .NET Core 实现基于JWT的登录认证

很多同学说AgileConfig的UI实在是太丑了。我想想也是的&#xff0c;本来这个项目是我自己使用的&#xff0c;一开始甚至连UI都没有&#xff0c;全靠手动在数据库里修改数据。后来加上了UI也是使用了老掉牙的bootstrap3做为基础样式。前台框架也是使用了angularjs&#xff0c;同…

武汉大学计算机学院2019考研复试,2019年武汉大学硕士研究生复试及录取名单汇总...

原标题&#xff1a;2019年武汉大学硕士研究生复试及录取名单汇总考生可以通过录取名单了解到很多重要的信息&#xff0c;例如复试比例&#xff0c;进复试最低分&#xff0c;复试录取成绩&#xff0c;录取总评成绩等重要信息。以下是我们整理收集到的各学院复试录取名单汇总&…

ugui unity 取消选择_UGUI中几种不规则按钮的实现方式

前言UGUI中的按钮默认是矩形的&#xff0c;若要实现非矩形按钮该怎么做呢&#xff1f;比如这样的按钮&#xff1a;本文将介绍两种实现方式供大家选择。使用alphaHitTestMinimumThresholdImage类的alphaHitTestMinimumThreshold是一个浮点值&#xff0c;Raycast检测时只有图片中…

你的专业 VS 你妈口中你的专业

亲妈认证★英语语言文学我妈&#xff1a;她就是一个学英语的~我同学&#xff1a;你学英语的啊&#xff1f;那你看美剧不用看字幕的吧&#xff1f;你听英文歌都听得懂的吧&#xff1f;这个怎么翻译啊&#xff1f;这上面写的什么&#xff1f;你不是专八吗&#xff1f;哈喽~ 在吗&…

反射 + 抽象工厂模式切换不同的实现方法

概述工厂模式&#xff08;Abstract Factory&#xff09;定义 &#xff1a;提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类。抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是围绕一个超级工厂创建其他工厂。该超级工厂又称为其…

计算机应用乘法,计算机系统原理(十) 二进制整数的乘法运算和除法运算

2.5我们着重介绍了二进制整数的加、减运算&#xff0c;本次我们继续介绍乘、除运算。本章是迄今为止最难的一章&#xff0c;希望各位猿友有所收获&#xff0c;也别忘了“点个推荐哦”。引言运算一直是程序运行当中一个重要的环节&#xff0c;而在二进制的运算过程当中&#xff…

3 年工作经验程序员应有的技能

前言因为和同事有约定再加上LZ自己也喜欢做完一件事之后进行总结&#xff0c;因此有了这篇文章。这篇文章大部分内容都是面向整个程序员群体的&#xff0c;当然因为LZ本身是做Java开发的&#xff0c;因此有一部分内容也是专门面向咱们Java程序员的。第二阶段&#xff1a;五年五…

应急响应中的溯源方法

在发现有入侵者后&#xff0c;快速由守转攻&#xff0c;进行精准地溯源反制&#xff0c;收集攻击路径和攻击者身份信息&#xff0c;勾勒出完整的攻击者画像。 对内溯源与对内溯源 对内溯源&#xff1a;确认攻击者的行为 &#xff0c;分析日志 数据包等&#xff1b; 对外溯源&…

POP3口令扫描案例

通过本案例可以学到&#xff1a; (1)了解POP3有关知识(2)利用Hscan工具软件来破解POP3账号和口令现在很多邮箱服务器都支持POP3功能&#xff0c;通过POP3来收取信件&#xff0c;收取信件时仅仅需要提供用户名和密码。目前有很多工具可以扫描POP3邮件账号和口令&#xff0c;本案…

中connect怎么用_烘焙中的各种酒,到底该怎么用?

​在烘焙食谱中&#xff0c;经常会出现“酒”这样材料。烘焙中的酒&#xff0c;仿佛是个神秘的存在&#xff0c;品种也繁多得让人一脸懵逼&#xff0c;朗姆酒是干嘛用的&#xff1f;怎么还有分白朗姆和金朗姆&#xff1f;和利口酒有什么区别&#xff1f;利口酒和力娇酒是同一个…

QQ旋风爆缓冲区溢出漏洞

据金山毒霸安全实验室5月7日透露&#xff0c;金山毒霸安全实验室研究人员进行例行漏洞检查过程中&#xff0c;发现QQ旋风存在一鲜为人知的缓冲区溢出0day漏洞&#xff0c;***者可以利用该漏洞制造恶意URL&#xff0c;使用IE6&#xff0c;7内核的各种浏览器均会受此漏洞的影响。…

w10计算机无法打印,win10升级后惠普无法打印怎么解决_win10升级后惠普打印不了的处理办法...

使用电脑工作或学习时&#xff0c;我们经常会需要用到打印机。可是最近有一些网友却反映说&#xff0c;自己的win10电脑在升级后出现了惠普无法打印的情况&#xff0c;这是怎么一回事呢&#xff1f;我们又该怎么解决呢&#xff1f;用户不是很清楚&#xff0c;所以对此今天本文为…

女神节爆猛料!. NET程序员男女比例公布!

今天是三八女神节&#xff0c;这里先祝广大的程序员妹子们节日快乐&#xff0c;健康美丽&#xff01;有一个问题&#xff0c;相信很多.NET程序员都很感兴趣&#xff1a;.NET程序员中女生占比多少&#xff1f;先来公布答案&#xff1a;在本次调查中发现&#xff0c;.NET程序员群…

金蝶凭证序时簿在哪_来了!金蝶日常账务处理大全

上一期给宝宝们更新了金蝶软件建账的一些处理流程&#xff0c;宝宝们已经迫不及待要求后续了。在日常处理部分主要是以下几个方面一、凭证审核1.凭证录入点击主窗口中的【凭证】&#xff0c;单击【凭证】录入在凭证录入窗口中单击【凭证录入】按钮&#xff0c;在这个窗口中就可…

在C#中使用SQLite

SQLite 是一个嵌入式的关系数据库系统&#xff0c;使用十分广泛。在一些数据量不大的应用程序中&#xff0c;如果使用SQLite可以极大的减少部署时的工作量。 要在C#中使用SQLite也很简单&#xff0c;只要找一个C#的wrapper就可以了&#xff0c;例如&#xff0c;我使用的就是来自…

BI 界震动 - Power BI Premium 个人版只要每月 120 元

大事来了就在今天&#xff0c;微软宣布&#xff1a;Power BI Premium Per User 定价&#xff1a;每月 120 元人民币。我只能说&#xff1a;他没有骗人。Power BI 团队也在这个战略决策上符合了微软的核心使命。这一举措将更加彻底的巩固微软 Power BI 的商业智能帝国地位&#…

西北工业大学计算机毕业论文,光纤通信发射机本科毕业论文 西北工业大学.docx...

光纤通信发射机本科毕业论文 西北工业大学本科毕业设计论文 PAGE 41摘 要 直接调制光发射机能完成对电信号的处理&#xff0c;其功能是把电脉冲信号变成光脉冲信号。本文先介绍了光纤通信的发展背景&#xff0c;光纤相对于传统铜导线的优越性&#xff0c;以及光纤通信未来的发展…