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 的一个实例。
任何帮助澄清将不胜感激,
谢谢!
using 的目的IHttpClientFactory
不是重用HttpClient
. 相反,它是重用(通过池化)HttpMessageHandler
(实际上HttpClientHandler
是从抽象派生的)实例,它是HttpMessageHandler
管理 HTTP 连接和套接字的底层对象。Microsoft Docs 中的这张图表很好地展示了这一点。
您担心频繁调用IHttpClientFactory.CreateClient()
会产生与频繁调用 相同的问题new HttpClient()
。然而,这种情况并非如此。正如Microsoft docs所解释的,频繁调用new HttpClient()
将导致套接字耗尽的原因是此构造函数将创建一个新实例HttpMessageHandler
:
但是,问题实际上并不在于 HttpClient 本身,而在于 HttpClient 的默认构造函数,因为它创建了一个新的 HttpMessageHandler 的具体实例,这是上面提到的套接字耗尽和 DNS 更改问题的实例。
您可以从看到源代码的IHttpClientFactory
,它不使用的参数构造函数HttpClient
在CreateClient()
。相反,它HttpMessageHandler
从池中获取并将其注入到 created 中HttpClient
。
无论您使用类型化客户端还是命名客户端,都应该像使用临时对象一样使用 HttpClient 实例:创建它的成本很低,并且不需要长时间缓存它。
归档时间: |
|
查看次数: |
2157 次 |
最近记录: |