带有 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&lt;MyWebServiceClient&gt;() 配置依赖注入。详细信息在链接的文档中。

以上是关于带有 HttpClientFactory 的 ASP.NET Core:最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章

使用 .NET 4.6.2 中的 HttpClientFactory

HttpClientFactory.Create 与新的 HttpClient

具有 HttpClientFactory 实现的动态代理

为集成测试创建默认的 HttpClientFactory

HttpClientFactory与Steeltoe结合来完成服务发现

.NET Core HttpClientFactory+Consul实现服务发现