繁体   English   中英

ASP.NET 核心与 HttpClientFactory:最佳实践?

[英]ASP.NET Core with HttpClientFactory : best practice?

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

我实例化了一个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 调用一些 function。 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 服务器进行测试,并且经常遇到异常

由于配置的HttpClient.Timeout 100 秒,请求被取消

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM