HttpClient 注入 Singleton

Ale*_*xey 11 c# .net-core

假设我们有这样的代码:

services.AddHttpClient();
services.AddSingleton<IMyService, MyService>();

...

public class MyService : IMyService
{
    public MyService(HttpClient httpClient)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

有一些问题(可能很愚蠢,但我只是想澄清一些事情):

  1. 它会用来HttpClientFactory创建 的实例吗HttpClient
  2. 我猜它会使用,HttpClientFactory但在这种情况下,DNS 更改会出现问题吗?

目前尚不清楚HttpMessageHandlers 是否会针对单例服务进行管理,以及是否应该对服务进行范围限制以获得HttpClientFactory使用的所有好处。

小智 14

  1. 它会用来HttpClientFactory创建 的实例吗HttpClient

是的。默认情况下在HttpClientFactory 注册HttpClient期间注册为临时服务。

  1. 我猜它会使用,HttpClientFactory但在这种情况下,DNS 更改会出现问题吗?

没错,它仍然会。当你将它注入到单例中时,HttpClient这里只会被创建一次。为了利用HttpClientFactorysHttpMessageHandler池化,您需要HttpClients 是短暂的。因此,为此,您宁愿需要注入IHttpClientFactory自身并CreateClient在需要时调用。(请注意,short-livesHttpClient仅适用于HttpClientFactory使用)。顺便说一句,切换到类型化客户端在注入单例时没有帮助,HttpClient最终仍然只会创建一次,请参阅https://github.com/dotnet/runtime/issues/64034

此外,您实际上可以HttpClientFactory完全避免并仍然遵守 DNS 更改。为此,您可能有一个静态/单例HttpClient,并PooledConnectionLifetime设置了一些合理的超时(例如,同样的 2 分钟HttpClientFactory

services.AddSingleton(() => new HttpClient(
    new SocketsHttpHandler { PooledConnectionLifetime = TimeSpan.FromMinutes(2) }
));
Run Code Online (Sandbox Code Playgroud)