手机版

Asp中核心2.1前后使用HttpClient的两种方式 网

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

前言

在的应用开发中。Net Core,调用第三方接口比较常见,使用HttpClient的次数和频率最高。英寸Net Core,HttpClient的使用模式也随着版本的升级发生了变化。这一次,我们将解释Asp.Net核心2.1前后使用的两种模式。

一、最初的HttpClient用法

一般来说,当你喜欢使用它时,你会选择获取资源。因此,当有需求时,您将使用HttpClient调用资源,并且您将使用以下方式或其他方式来获取资源。

//做某事.使用(var httpClient=new httpClient()){ var request uri=' http://aspnetcore . online/API/resource/get resource ';var httpResponseMessage=wait httpClient。GetAsync(Requesturi);//做某事.返回Ok(httpResponseMessage);}如果可以正常访问目标地址,则会返回相应的资源信息。

另一个例子是在Post模式下提交并返回相应的内容,可以直接使用。

//做某事.使用(var httpClient=new httpClient()){ var Requesturi=' http://aspnetcore . online/API/resource/post resource ';var http response message=wait httpclient。postasjsonasync (requesturi,‘星城软件’);//做某事.返回Ok(httpResponseMessage);}但是,这种情况下会出现严重的问题。在不停呼叫的情况下,tcp连接数将会耗尽。虽然HttpClient是通过使用方法调用并在退出前调用Dispose()方法来释放的,但tcp连接仍然保持,并且在240s后将自动断开,这涉及到连接状态。首先,我们必须了解http的工作原理。http协议基于tcp协议。当浏览器需要从服务器获取数据时,它会发送一个http请求。Http将通过tcp建立到服务器的连接通道。当该请求所需的数据完成后,http将立即断开tcp连接。这个过程很短。因此,http连接是短连接和无状态连接。但是只要我们不通过代码关闭tcp连接,这个连接就会一直存在于客户端和服务器端的过程中,相关的状态数据也会一直保存,直到非响应状态持续默认的关闭时间。

当短期请求量太大时,这可能会导致“套接字资源耗尽异常”。所以为了解决这个问题,我们想到不发布HttpClient,一直作为一个单一的案例使用。实现单一案例的方法有很多。

如果使用单例模式,则只生成一个HttpClient

私有静态HttpClient _ httpClient=nullpublic HttpClient CreateHttpClient(){ if(_ HttpClient==null)_ HttpClient=new HttpClient();return _ httpClient}或者在初始化时完成单实例注入,创建一个IHttpClient接口,并实现StandardHttpClient,在实现类中添加HttpClient属性,在实现类构造函数中初始化后直接使用实现类完成资源请求。

//完整的单实例注入服务。在启动时添加singleton httpclient、standard httpclient();公共接口IHttpClient {//做点什么}公共类standard HttpClient : IHttpClient { private HttpClient _ client;public standard HttpClient(){ _ client=new HttpClient();}//做某事.}虽然这样解决了‘套接字资源耗尽异常’,但也带来了新的问题,无法在DNS生存期(TTL)内生存。当主机域名系统更新时,可能会出现异常,表明无法解析主机名,因为主机域名系统更新不会更新单个HttpClient。

发送请求时出错。无法解析主机名发送请求时出错。无法解析主机名

二、现有的HttpClient用法

之后。Net Core2.1,微软引入了HttpClientFactory来彻底解决这个问题。工厂模式负责创建对象,这个类主要负责创建HttpClient实例

首先在StartUp中注册,系统可能会提示您安装此Nuget软件包

服务。AddHttpClient();这个方法的内部实现过程可以浏览:https://www.jb51.net/article/157254.htm

其次,当您需要使用它时,可以使用构造函数注入

[Route(' API/[controller]')][API controller]公共类Httpclientcontroller : controller base { IHttpClientFactory _ Httpclientfactory;public Httpclientcontroller(IHttpClientFactory Httpclientfactory){ _ Httpclientfactory=Httpclientfactory;}[HttpGet][Route(name of(Index))]public async TaskIActionResult Index(){ var client=_ httpClientFactory。create client();var结果=等待客户端。GetAsync(' http://aspnetcore . online/API/resource/getresource ');返回Ok(结果);}}具体实现原理简述如下:HttpClientFactory内部管理一个连接句柄池,每个HttpClient都用一个句柄进行跟踪和管理。当实例用完时,句柄仍然控制资源的释放。在短时间的海量处理中,可以针对不同的实例对句柄的这一部分进行跟踪和管理,从而延长句柄即对应套接字的生命周期,实现套接字的重用。

摘要

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

版权声明:Asp中核心2.1前后使用HttpClient的两种方式 网是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。