我有一个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类调用一些函数。全班都是这样的
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秒,请求被取消。
这是否是由上述实现引起的,还是这肯定是服务器问题?
发布于 2021-12-09 21:57:02
您所得到的错误是因为客户端API调用在100秒后超时,这是默认的超时,因此这可能是服务器没有响应。
每5秒创建一个新的HttpClient应该很好。HttpClient实例封装了一个池化的HttpMessageHandler,因此它是轻量级的(与池处理程序相反)。处理它不会释放处理程序,否则会导致资源耗尽(客户端套接字不会立即释放)。
由于内部处理程序在默认情况下被配置为定期“刷新自身”以获取新的DNS信息,因此实际上不需要自己使用IHttpClientFactory。您可以使用类型化客户机直接注入HttpClient,如在IHttpClientFactory内核中使用ASP.NET发出HTTP请求中所述。文章使用IHttpClientFactory实现弹性HTTP请求还解释了在.NET中使用HttpClient的“最佳实践”。
https://stackoverflow.com/questions/70296816
复制相似问题