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
的“最佳实践”。
我有一个 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
的“最佳实践”。