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.

Polly Timeout optimista utilizando HttpClientFactory. ¿Cómo puedo usar el token de cancelación?

Me gustaría entender cómo implementar una política de tiempo de espera optimista con Polly utilizando el HttpClientFactory.

En los ejemplos en la red, la política de tiempo de espera se utiliza al llamar a métodos asíncronos para poder pasar el token de cancelación. Pero si configuro la política de tiempo de espera desde la configuración de servicios, como se indica en la guía, ¿cómo gestiono el token de cancelación?

En el código de ejemplo, que se muestra en la guía enlazada, veo esto:

var timeoutPolicy = Policy.TimeoutAsync<httpresponsemessage>(10); // Tiempo de espera para un intento individual

serviceCollection.AddHttpClient("GitHub", client =>
{
    client.BaseAddress = new Uri("https://api.github.com/");
    client.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
    client.Timeout = TimeSpan.FromSeconds(60); // Tiempo de espera global para todos los intentos
})
.AddPolicyHandler(retryPolicy)
.AddPolicyHandler(timeoutPolicy);

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para implementar una política de tiempo de espera optimista con Polly usando HttpClientFactory, puedes agregar una política de tiempo de espera al HttpClient utilizando el método AddPolicyHandler como se muestra en el código de ejemplo. Sin embargo, este código establece el tiempo de espera general para todos los intentos y no administra el token de cancelación para solicitudes individuales.

    Para implementar el token de cancelación, puedes utilizar métodos asíncronos que acepten un token de cancelación y pasar el token a la política de tiempo de espera. Por ejemplo:

    // Crear un token de cancelación
    var cancellationToken = new CancellationTokenSource(TimeSpan.FromSeconds(2)).Token;
    
    // Agregar una política de tiempo de espera al HttpClient
    var timeoutPolicy = Policy.TimeoutAsync<httpresponsemessage>(TimeSpan.FromSeconds(10), onTimeoutAsync: (context, timeSpan, task) =>
    {
        // Manejar el token de cancelación cuando se produce el tiempo de espera
        cancellationToken.Cancel();
    
        return Task.CompletedTask;
    });
    
    var client = httpClientFactory.CreateClient("GitHub");
    
    // Enviar una solicitud con el token de cancelación
    var response = await timeoutPolicy.ExecuteAsync(context => client.GetAsync("/repos/dotnet/AspNetCore", context.CancellationToken), new Context(cancellationToken));
    

    En este código, se crea un token de cancelación con un tiempo de espera de 2 segundos utilizando CancellationTokenSource. La política de tiempo de espera se agrega al HttpClient utilizando el método AddPolicyHandler como antes, pero ahora la política recibe un contexto con el token de cancelación utilizando el método ExecuteAsync. El delegado onTimeoutAsync se utiliza para manejar el token de cancelación cuando se produce el tiempo de espera. Finalmente, se envía la solicitud utilizando un método asíncrono que acepta el token de cancelación.

Comments are closed.