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?
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 recupera el cliente con nombre (
someClient
) utilizando el métodoCreateClient
. La propiedadBaseAddress
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 consomeClient
a la llamada al endpoint especificado enBaseAddress
. Dado que cada llamada aSomeCall
especifica una URL diferente, la política se aplica individualmente a cada llamada.