ASP.NET Core con HttpClientFactory: ¿mejor práctica?
Tengo una aplicación de ASP.NET Core que necesita llamar de forma cíclica a un servicio web.
Instancié un HostedService
:
public class MyHostedService : IHostedService
{
public MyHostedService(IMyWebServiceClient MyWebServiceClient)
{
...
}
<pre><code>public Task StartAsync(CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
{
var result = await myWebServiceClient.CallSomeWebApi();
await Task.Delay(5000, cancellationToken);
}
return Task.CompletedTask;
}
</code></pre>
<p>}
que llama a alguna función de una clase WebServiceClient
. La clase se ve así:
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);
}
}
}
El código de inicio es este:
public void ConfigureServices(IServiceCollection services)
{
....
services.AddHttpClient();
services.AddSingleton<IMyWebServiceClient, MyWebServiceClient>();
services.AddHostedService<MyHostedService>();
....
}
¿Alguien puede decirme si es una buena práctica llamar cíclicamente
var httpClient = httpClientFactory.CreateClient()
(por ejemplo, cada 5 segundos)?
¿Podrían ocurrir efectos secundarios debido a esto? Estoy probando con algún servidor web y a menudo obtengo una excepción:
La solicitud se canceló debido al
HttpClient.Timeout
configurado de 100 segundos ha expirado.
¿Podría esto ser causado por la implementación anterior o definitivamente es un problema del servidor?
davy.ai
Llamar a
httpClientFactory.CreateClient()
de forma cíclica cada pocos segundos generalmente se considera una buena práctica, ya que permite que el HttpClient se deseche adecuadamente después de cada solicitud, evitando el agotamiento de recursos y posibles fugas de memoria.Sin embargo, la excepción que estás recibiendo (
Se canceló la solicitud debido a que se agotó el tiempo de espera HttpClient.Timeout configurado en 100 segundos
) podría ser causada por varios factores. Una causa común es un servidor lento o no receptivo, que está tardando más que el período de tiempo de espera en responder a tus solicitudes.Para solucionar este problema, podrías intentar aumentar el período de tiempo de espera en el HttpClient o agregar lógica de reintentos a tu código para volver a intentar automáticamente las solicitudes fallidas. También podrías considerar registrar información adicional desde el lado del servidor para ayudar a diagnosticar cualquier problema de rendimiento.
En general, si bien llamar cíclicamente a un servicio web utilizando HttpClient y HttpClientFactory es una buena práctica, también es importante considerar cómo tratará tu código los errores y excepciones, y construir una sólida gestión de errores y lógica de reintentos según sea necesario.