【问题标题】:ASP.NET Core with HttpClientFactory : best practice?带有 HttpClientFactory 的 ASP.NET Core:最佳实践?
【发布时间】: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 秒,请求被取消

这可能是由上面的实现引起的,还是这绝对是服务器问题?

【问题讨论】:

    标签: c# asp.net-core httpclient webservice-client httpclientfactory


    【解决方案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;() 配置依赖注入。详细信息在链接的文档中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 2020-04-19
    • 2021-05-03
    • 2019-01-22
    相关资源
    最近更新 更多