ASP.NET Core with HttpClientFactory:最佳实践?

ASP.NET Core with HttpClientFactory : best practice?

我有一个 ASP.NET 核心应用程序需要循环调用网络服务。

我实例化了一个 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 class 调用一些函数。 class 看起来像这样

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 服务器进行测试,并且经常遇到异常

The request was canceled due to the configured HttpClient.Timeout of 100 seconds elapsing

这可能是上面的实现导致的,还是这肯定是服务器问题?

您收到的错误是因为客户端 API 调用在默认超时 100 秒后超时,所以这可能是服务器没有响应。

每五秒创建一个新的HttpClient应该没问题。 HttpClient 实例包装了一个池化的 HttpMessageHandler ,因此它是轻量级的(与池化处理程序相反)。处理它不会处理处理程序,否则可能会导致资源耗尽(客户端套接字不会立即释放)。

因为内部处理程序默认配置为定期“刷新自身”以获取新的 DNS 信息,您实际上不需要自己使用 IHttpClientFactory。您可以改为使用 类型的客户端 直接注入 HttpClient,如 Make HTTP requests using IHttpClientFactory in ASP.NET Core. The article Use IHttpClientFactory to implement resilient HTTP requests 中所述,还解释了在 .NET 中使用 HttpClient 的“最佳实践”。