假设我们有这样的代码:
services.AddHttpClient();
services.AddSingleton<IMyService, MyService>();
...
public class MyService : IMyService
{
public MyService(HttpClient httpClient)
{
}
}
Run Code Online (Sandbox Code Playgroud)
有一些问题(可能很愚蠢,但我只是想澄清一些事情):
HttpClientFactory创建 的实例吗HttpClient?HttpClientFactory但在这种情况下,DNS 更改会出现问题吗?目前尚不清楚HttpMessageHandlers 是否会针对单例服务进行管理,以及是否应该对服务进行范围限制以获得HttpClientFactory使用的所有好处。
小智 14
- 它会用来
HttpClientFactory创建 的实例吗HttpClient?
是的。默认情况下在HttpClientFactory 注册HttpClient期间注册为临时服务。
- 我猜它会使用,
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)
| 归档时间: |
|
| 查看次数: |
5753 次 |
| 最近记录: |