.Net Core HttpClientFactory用于多个API服务

问题描述

我有一个.Net Core项目,该项目需要连接到大约4种不同的API服务,我对任何HttpClient代码都不熟悉,但是从我发现的结果来看,您通常只希望重用HttpClient的一个实例。据我所知,一般的共识是在.Net Core中使用HttpClientFactory,方法是在您的Startup类中注册它,然后使用DI进行请求。

现在,我的大多数认标头和BaseAddress url都大体相同,连接到4个diff API服务时该如何处理?我应该注册4个不同的命名客户端还是让一个客户端预先设置所有认信息,然后根据需要手动配置它,例如配置地址?

一般的问题可能是因为我还很陌生,所以据说可以重用HttpClient的一个实例。

  1. 如果我为每个API服务创建4个不同的命名客户端,那么当我调用.CreateClient()方法时,这会不会创建HttpClient的4个实例?
  2. .CreateClient()每次被调用时都会创建一个新实例,如果说我需要对一个API服务进行3次不同的调用,这不会破坏拥有一个HttpClient实例的目的。调用.CreateClient()建立某种连接,这将创建HttpClient的3个实例?

任何有助于澄清的帮助,

谢谢!

解决方法

使用IHttpClientFactory的目的不是重用HttpClient的实例。相反,它是重用(通过池化)HttpMessageHandler(实际上是HttpClientHandler的实例,它是从抽象HttpMessageHandler派生的),它是管理HTTP连接和套接字的基础对象。来自Microsoft Docs的This diagram表现得很好。

您担心频繁致电IHttpClientFactory.CreateClient()会产生与频繁致电new HttpClient()相同的问题。然而,这种情况并非如此。如Microsoft docs所述,频繁调用new HttpClient()会导致套接字耗尽的原因是此构造函数将创建HttpMessageHandler的新实例:

但是,问题实际上并不是真正的HttpClient本身,而是HttpClient的默认构造函数,因为它创建了HttpMessageHandler的新的具体实例,该实例具有上述套接字耗尽和DNS更改的问题。 / p>

您可以从IHttpClientFactory的{​​{3}}中看出,它没有使用HttpClientCreateClient()的无参数构造函数。而是从池中获取HttpMessageHandler,并将其注入到创建的HttpClient中。

无论您使用的是类型化客户端还是命名客户端,都应使用HttpClient实例,就像它是一个临时对象一样:它创建起来很便宜,并且不需要长时间缓存它。