es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , , ,

Answer

  1. Avatar for 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.

Comments are closed.