带有 HttpClientFactory 的 ASP.NET Core:最佳实践?
Posted
技术标签:
【中文标题】带有 HttpClientFactory 的 ASP.NET Core:最佳实践?【英文标题】:ASP.NET Core with HttpClientFactory : best practice? 【发布时间】:2021-12-09 21:16:16 【问题描述】:我有一个需要循环调用 Web 服务的 ASP.NET Core 应用程序。
我实例化了一个HostedService
:
public class MyHostedService : IHostedService
public MyHostedService(IMyWebServiceClient MyWebServiceClient)
...
public Task StartAsync(CancellationToken cancellationToken)
while (!cancellationToken.IsCancellationRequested)
var result = await myWebServiceClient.CallSomeWebApi();
await Task.Delay(5000, cancellationToken);
return Task.CompletedTask;
从WebServiceClient
类中调用一些函数。类是这样的
public class MyWebServiceClient: IMyWebServiceClient
private readonly IHttpClientFactory httpClientFactory;
public MyWebServiceClient(IHttpClientFactory httpClientFactory)
this.httpClientFactory = httpClientFactory;
public async Task CallSomeWebApi()
using (var httpClient = httpClientFactory.CreateClient())
var requestMessage = new HttpRequestMessage(...);
var response = await httpClient.SendAsync(requestMessage);
启动代码是这样的:
public void ConfigureServices(IServiceCollection services)
....
services.AddHttpClient();
services.AddSingleton<IMyWebServiceClient, MyWebServiceClient>();
services.AddHostedService<MyHostedService>();
....
谁能告诉我循环调用是否是个好习惯
var httpClient = httpClientFactory.CreateClient()
(例如每 5 秒)?
会因此产生一些副作用吗?我正在使用一些 Web 服务器进行测试,并且经常遇到异常
由于配置的
HttpClient.Timeout
已过 100 秒,请求被取消
这可能是由上面的实现引起的,还是这绝对是服务器问题?
【问题讨论】:
【参考方案1】:您得到的错误是因为客户端 API 调用在 100 秒后超时,这是默认超时,所以这可能是服务器没有响应。
每五秒创建一个新的HttpClient
应该没问题。 HttpClient
实例包装了一个池化的HttpMessageHandler
,因此它是轻量级的(与池化处理程序相反)。释放它不会释放处理程序,否则可能会导致资源耗尽(客户端套接字不会立即释放)。
因为默认情况下内部处理程序配置为“刷新自身”以定期获取新的 DNS 信息,所以您实际上不需要自己使用IHttpClientFactory
。您可以改用Make HTTP requests using IHttpClientFactory in ASP.NET Core 中所述的类型化客户端 直接注入HttpClient
。文章 Use IHttpClientFactory to implement resilient HTTP requests 还解释了在 .NET 中使用 HttpClient
的“最佳实践”。
【讨论】:
感谢您的链接,我会看看。据我从您的回答中了解到,代码足够健壮,也可以用于生产。是否可以更改 100 秒 httpclient 超时? @RickyTad 是的,您可以设置HttpClient.Timeout
属性来更改超时。如果您使用 typed client 方法,其中HttpClient
被注入到您的服务构造函数中,您可以修改该构造函数中的HttpClient
实例,或者通过调用AddHttpClient<MyWebServiceClient>()
配置依赖注入。详细信息在链接的文档中。以上是关于带有 HttpClientFactory 的 ASP.NET Core:最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章
使用 .NET 4.6.2 中的 HttpClientFactory
HttpClientFactory.Create 与新的 HttpClient