.Net Core HttpClientFactory for Multiple API Services



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

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

一般问题是,因为我对此相当陌生,据说它重用了 HttpClient 的一个实例。

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

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

谢谢!

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

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

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

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

无论使用类型客户端还是命名客户端,都应将 HttpClient 实例用作瞬态对象:创建起来很便宜,并且不需要长时间缓存它。

最新更新