用于多个 API 服务的 .Net Core HttpClientFactory

SC.*_*Cee 7 c# asp.net-core httpclientfactory

我有一个 .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 次不同的调用,每个调用都会调用一个 . CreateClient() 建立某种连接,这将创建 HttpClient 的 3 个实例?

任何帮助澄清将不胜感激,

谢谢!

sch*_*nyw 5

using 的目的IHttpClientFactory不是重用HttpClient. 相反,它是重用(通过池化)HttpMessageHandler(实际上HttpClientHandler是从抽象派生的)实例,它是HttpMessageHandler管理 HTTP 连接和套接字的底层对象。Microsoft Docs 中的这张图表很好地展示了这一点。

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

但是,问题实际上并不在于 HttpClient 本身,而在于 HttpClient 的默认构造函数,因为它创建了一个新的 HttpMessageHandler 的具体实例,这是上面提到的套接字耗尽和 DNS 更改问题的实例。

您可以从看到源代码IHttpClientFactory,它不使用的参数构造函数HttpClientCreateClient()。相反,它HttpMessageHandler从池中获取并将其注入到 created 中HttpClient

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