问题描述
我有一个.Net Core项目,该项目需要连接到大约4种不同的API服务,我对任何HttpClient代码都不熟悉,但是从我发现的结果来看,您通常只希望重用HttpClient的一个实例。据我所知,一般的共识是在.Net Core中使用HttpClientFactory,方法是在您的Startup类中注册它,然后使用DI进行请求。
现在,我的大多数默认标头和BaseAddress url都大体相同,连接到4个diff API服务时该如何处理?我应该注册4个不同的命名客户端还是让一个客户端预先设置所有默认信息,然后根据需要手动配置它,例如配置地址?
一般的问题可能是因为我还很陌生,所以据说可以重用HttpClient的一个实例。
- 如果我为每个API服务创建4个不同的命名客户端,那么当我调用.CreateClient()方法时,这会不会创建HttpClient的4个实例?
- .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}}中看出,它没有使用HttpClient
中CreateClient()
的无参数构造函数。而是从池中获取HttpMessageHandler
,并将其注入到创建的HttpClient
中。
无论您使用的是类型化客户端还是命名客户端,都应使用HttpClient实例,就像它是一个临时对象一样:它创建起来很便宜,并且不需要长时间缓存它。