如安在ASP.NET Core中利用HttpClientFactory

ASP.Net Core 是一个开源的,跨平台的,轻量级模块化框架,可用它来构建高机能的Web措施,这篇文章我们将会接头如安在 ASP.Net Core 中利用 HttpClientFactory。

为什么要利用 HttpClientFactory

可以用 HttpClientFactory 来会合化打点 HttpClient,工场提供了对 HttpClient 的建设,设置和调治,值得一提的是:HttpClient 一直都是 Http 请求业务方面的一等国民。

HttpClient 虽好,但它有一些缺点:

建设太多的 HttpClient 是一种低效的行为,因为当一个新客户端毗连到长途 Server 时,你的应用措施还需要包袱着重连长途 Server 的开销。

假如每一个 request 都建设一个 HttpClient,当应用措施负载过大, Socket 必将耗尽,好比默认环境下 HttpClient 会维持至少4分钟的 Connection 毗连。

所以推荐的做法是建设一个可供复用的共享式 HttpClient 实例,假如你要冲破沙锅问到低的话,纵然是建设共享式的 HttpClient 也会有许多问题,好比它会无视 DNS 缓存生效,那怎么办呢?可以用 .NET Core 2.1 引入的 HttpClientFactory 来办理此问题。。。用它来统一化的高效打点 HttpClient。

利用 HttpClientFactory

HttpClientFactory 有两种利用方法。

NamedClient

TypedClient

所谓的 NamedClient 就是注册带有标志的 HttpClient 到 HttpClientFactory 工场中,下面的代码展示了一个名为 IDGCustomApi 的 HttpClient 的工场注册。

        // This method gets called by the runtime. Use this method to add services to the container.         public void ConfigureServices(IServiceCollection services)         {             services.AddHttpClient("IDGCustomApi", client =>             {                 client.BaseAddress = new Uri("https://localhost:6045/");                 client.DefaultRequestHeaders.Add("Accept", "application/json");                 client.DefaultRequestHeaders.Add("User-Agent", "IDG");             });             services.AddControllers();         }

所谓的 TypedClient 就是注册一个你自界说的 HttpClient,我想你必定有点懵逼了,不要紧,我此刻就来自界说 HttpClient, 然后通过 AddHttpClient() 注册到容器中。

    public class CustomHttpClient     {         public HttpClient Client { get; }         public CustomHttpClient(HttpClient client)         {             Client = client;         }     }     public class Startup     {         // This method gets called by the runtime. Use this method to add services to the container.         public void ConfigureServices(IServiceCollection services)         {             services.AddHttpClient<CustomHttpClient>(client => client.BaseAddress = new Uri("https://localhost:6045/"));             services.AddControllers();         }     }

注入 Controller

为了可以或许在 Controller 中利用,可以将 IHttpClientFactory 通过结构函数方法举办注入,参考如下代码:

    [ApiController]     [Route("[controller]")]     public class WeatherForecastController : ControllerBase     {         private IHttpClientFactory httpClientFactory;         public WeatherForecastController(ILogger<WeatherForecastController> logger, IHttpClientFactory httpClientFactory)         {             this.httpClientFactory = httpClientFactory;         }         [HttpGet]         public async Task<string> Get()         {             var httpClient = httpClientFactory.CreateClient("IDGCustomApi");             string html = await httpClient.GetStringAsync("http://bing.com");             return html;         }     }

如何在ASP.NET Core中操作HttpClientFactory

从 IHttpClientFactory 的默认实现 DefaultHttpClientFactory 的源码也可以看出,httpClient 所关联的 HttpMessageHandler 和 Options 都被工场跟踪和管控。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsjfzx.html