宝哥软件园

净核心中客户端的正确打开方式

编辑:宝哥软件园 来源:互联网 时间:2021-08-27

前言

在Asp。网核心1.0时代,由于设计上的问题,HttpClient给开发者带来了无尽的困扰,用Asp。网核心开发团队的话来说就是:我们注意到,HttpClient被很多开发人员不正确的使用。得益于。净核心不断的版本快速升级;

问题来源

长期以来,网开发者都通过下面的方式发送超文本传送协议(超文本传输协议的缩写)请求:

使用(var Http client=new Http client()){ var response=wait Http client .GetAsync(uri);//用响应做某事}这段代码理论上来说遵守了C#的最佳实践,HttpClient是接口类型,所以我们通过使用语法糖来使用HttpClient。微软官方的文档也提到:

通常,当您使用接口对象时,应该在使用语句中声明并实例化它

可是,当我们试图运行下面的测试:

公共异步任务发送请求(){控制台WriteLine(‘启动请求’);for(int I=0;i10i){ 0使用(var client=new Http client()){ var result=wait client .GetAsync(' http://www .百度。com’);控制台WriteLine(结果状态代码);} }控制台写入行(“请求完成”);}此时在末端的下列出所有端口:

netstat-AP TCP | grep-I“time _ wait”(9500 . 163.com)

你会发现本地开启了10个端口,这说明客户端的工作原理其实跟我们认为的接口是有区别的,如果你把客户端用作大规模的超文本传送协议(超文本传输协议的缩写)请求,实际上会创建很多个超文本传送协议(超文本传输协议的缩写)连接,而且这些资源并不能被立即释放。一个显而易见的改进方法是共享同一个客户端实例,从而达到节约窝资源的目的。

私有静态只读Http client _ client=new Http client();公共异步任务发送请求2() { _testOutputHelper .写线("开始请求");for(int I=0;i10i ) { var result=await _client .GetAsync(' http://www .百度。com’);控制台WriteLine(结果状态代码);} _testOutputHelper .写线("请求完成");}这个方案似乎解决了问题,使用单例的客户端的确会减少窝资源,但是这个方案会引发新的问题:由于这个超文本传送协议(超文本传输协议的缩写)连接始终保持连接状态,所以当请求地址的域名服务器(域名服务器)发生更新的时候并不会应用到这个超文本传送协议(超文本传输协议的缩写)连接上。这个问题在微服务,高可用时代更加常见Singeton HttpClient不尊重域名系统更改。

最终,一个叫做HttpClientFactory的开源实现用来彻底解决这个问题。微软也将HttpClientFactory集成在了。净核心中。

在。净核心中创建HttpClient1 .添加框架

微软。扩展Http 2 .在依赖注入容器中注册服务

服务AddHttpClient();3.使用构造器注入使用IhttpClientFactory

公共类base cusage { private readonly IHttpClientFactory _ client factory;public basic cusage(IHttpClientFactory客户端工厂){ _客户端工厂=客户端工厂;}公共异步任务发送请求(){ var request=new Httprequestmessage(HttpMETHoD).Get,' http://www。百度。com’);var client=_clientFactory .创建客户端();定义变量响应=等待客户端发送异步(请求);//为响应做点什么}}4。使用名为客户端

由于我们在国防情报部容器中注册了唯一的HttpClientFactory,意味着通过HttpClientFactory创建出来的客户端可能是同一个配置和参数,如果你需要不同配置的HttpClient,你可以通过"起名字的"的方式注册不同的HttpClient。

服务. AddHttpClient('baidu ',c={ c . BaseAddress=new Uri(' https://www。百度。com’);c . defaultrequestheaders。添加(' Accept ',' application/JSON ');});一旦注册了一个名叫"百度"的HttpClient,你就可以通过下面的方式来建创建HttpClient:

var client=_clientFactory .CreateClient('百度');5.集成波莉

波莉是一个用来故障处理库,它允许开发者在超文本传送协议(超文本传输协议的缩写)请求中添加"重试、熔断器、超时等"策略。

先添加num get :

微软。扩展名。Http。波莉添加策略:

变量超时=策略。time out异步预响应消息(时间跨度。从秒(10));服务。AddHttpClient('baidu ')。AddPolicyHandler(请求=超时)。addtransienttperorpolicy(p=p . RetryAsync(3));当然,也有一些高阶用法。有关详细信息,请参见启动HTTP请求。简而言之,HttpClientFactory提供了一种高效实用的HttpClient方式。如果您还在新的HttpClient中,请尽快尝试新的方案。

摘要

以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。

更多资讯
游戏推荐
更多+