10

我有一个 .Net Core 项目需要连接到大约 4 个不同的 API 服务,我不是任何 HttpClient 代码的专家,但据我发现,您通常只想重用一个实例你的 HttpClient 的。据我所知,普遍的共识是在.Net Core 中使用 HttpClientFactory,方法是在 Startup 类中注册它,然后使用 DI 请求它。

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

一般问题是因为我对此很陌生,据说可以重复使用 HttpClient 的一个实例。

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

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

谢谢!

4

1 回答 1

6

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

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

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

从源码可以看出,IHttpClientFactory它没有使用HttpClientin的无参构造函数CreateClient()。相反,它HttpMessageHandler从池中获取并将其注入到 createdHttpClient中。

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

于 2020-09-10T07:01:07.023 回答