[英]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.