假设我们有这样的代码:
services.AddHttpClient();
services.AddSingleton<IMyService, MyService>();
...
public class MyService : IMyService
{
public MyService(HttpClient httpClient)
{
}
}
有一些问题(可能很愚蠢,但我只想澄清一些事情(:
- 它会使用
HttpClientFactory
来创建HttpClient
的实例吗 - 我猜它使用
HttpClientFactory
,但在这种情况下,它会在DNS更改方面出现问题吗
目前还不太清楚HttpMessageHandler
是否会针对单例服务进行管理,并且是否应该对服务进行作用域划分,以获得HttpClientFactory
使用的所有好处。
- 它会使用
HttpClientFactory
创建HttpClient
的实例吗
是。在HttpClientFactory注册期间,默认HttpClient
被注册为临时服务。
- 我猜它使用
HttpClientFactory
,但在这种情况下,它会在DNS更改方面出现问题吗
正确,它仍然会。当您将它注入到单例中时,这里的HttpClient
将只创建一次。为了利用HttpClientFactory
的HttpMessageHandler
池,您需要HttpClient
是短命的。因此,为此,您需要注入IHttpClientFactory
本身,并在需要时调用CreateClient
。(请注意,短寿命HttpClient
仅适用于HttpClientFactory
的使用(。BTW切换到类型化客户端在注入单例时没有帮助,HttpClient
最终仍然只创建一次,请参阅https://github.com/dotnet/runtime/issues/64034.
此外,您实际上可以完全避免HttpClientFactory
,并且仍然可以尊重DNS更改。为此,您可能有一个静态/单例HttpClient
,其中PooledConnectionLifetime
设置为某个合理的超时(例如HttpClientFactory
所做的相同的2分钟(
services.AddSingleton(() => new HttpClient(
new SocketsHttpHandler { PooledConnectionLifetime = TimeSpan.FromMinutes(2) }
));