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.

Cómo utilizar Polly y IHttpClientFactory por URL

Estoy tratando de encontrar una forma de utilizar un HttpClient usando IHttpClientFactory.CreateClient([nombre]), donde [nombre] es un HttpClient configurado utilizando Polly en la clase Startup usando PolicyRegistry.
Quiero que esa política se aplique para cada una de las URLs a las que hago llamadas utilizando ese cliente.

Entonces, si creo un cliente llamado “micliente” y a lo largo de mi aplicación haré llamadas a N URLs diferentes, utilizando ese cliente denominado, quiero que la política se aplique individualmente para cada URL, no como un todo.

Startup

PolicyRegistry registry = new PolicyRegistry();
AsyncPolicyWrap type1Policy = // algunaPolitica;
registry.Add("tipo1", type1Policy);
services.AddHttpClient("algúnCliente").AddPolicyHandlerFromRegistry("tipo1");

Servicio Consumidor

public class SomeService
{
    private IHttpClientFactory factory;
    public SomeService(IHttpClientFactory factory)
    {
        this.factory = factory;
    }
    public void SomeCall(string url)
    {
        var client = factory.GetClient("algúnCliente");
        client.SendAsync(...);
    }
}

En el caso mencionado anteriormente, quiero que la política configurada en la clase de inicio se tome individualmente para cada una de las URLs a las que estoy llamando.

¿Es eso posible?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible aplicar una política configurada utilizando Polly para cada URL individualmente cuando se usa IHttpClientFactory.CreateClient([name]) de la siguiente manera:

    Startup

    “`c#
    PolicyRegistry registry = new PolicyRegistry();
    AsyncPolicyWrap type1Policy = //somePolicy;
    registry.Add(“type1”, type1Policy);

    services.AddHttpClient(“someClient”)
    .AddPolicyHandlerFromRegistry(“type1”);


    En el código anterior, se agrega una política con nombre (`type1Policy`) al `PolicyRegistry`. El método de extensión `AddPolicyHandlerFromRegistry` se utiliza para asociar esa política con el cliente con nombre (`someClient`). **Algun servicio consumidor** ```c# public class SomeService { private IHttpClientFactory factory; public SomeService(IHttpClientFactory factory) { this.factory = factory; } public void SomeCall(string url) { var client = factory.CreateClient("someClient"); client.BaseAddress = new Uri(url); client.SendAsync(...); } }

    En el código anterior, se recupera el cliente con nombre (someClient) utilizando el método CreateClient. La propiedad BaseAddress del cliente se establece en la URL del endpoint que se está llamando. Esto es importante porque cada endpoint tendrá una URL diferente y, por lo tanto, se debe aplicar una política diferente a cada uno de ellos.

    Cuando se llama a client.SendAsync, se aplica la política asociada con someClient a la llamada al endpoint especificado en BaseAddress. Dado que cada llamada a SomeCall especifica una URL diferente, la política se aplica individualmente a cada llamada.

Comments are closed.