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.

Resolver HttpClient depende de la URL (con/sin Proxy)

La tarea consiste en configurar el proxy de HttpClient según una URL. Por ejemplo, si una URL contiene “hostname.com”, se debe establecer.

¿Cuál es la mejor práctica?

¿Es la siguiente una solución?

Registrar diferentes HttpClients en DI como:

— Configurar HttpClients tipados con diferentes proxies para cada servicio
services.AddHttpClient().ConfigurePrimaryHttpMessageHandler(GetHttpHandlerSetter(s => s.Service1));
services.AddHttpClient().ConfigurePrimaryHttpMessageHandler(GetHttpHandlerSetter(s => s.Service2));

— Configurar HttpClient con nombre sin proxy
services.AddHttpClient(“NoProxy”);

Y Service1 y Service2 resolverán IHttpClientFactory:

public class Service1
{
readonly IHttpClientFactory _httpClientFactory;

public IdgwConnectorManager(IHttpClientFactory httpClientFactory)
{
    _httpClientFactory = httpClientFactory;
}

public void Get(string url)
{
    if (url...)
    {
        _httpClientFactory.CreateClient(nameof(Service1));
    }
    else
    {
        _httpClientFactory.CreateClient("NoProxy");
    }
}

}

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Mejores prácticas para configurar el proxy de HttpClient en función de la URL

    La mejor práctica para configurar el proxy de HttpClient en función de la URL es utilizar un DelegatingHandler que verifique la URL de la solicitud y configure el proxy correspondiente.

    Aquí tienes un ejemplo de implementación:

    public class ProxyHandler : DelegatingHandler
    {
        private readonly IProxyProvider _proxyProvider;
    
        public ProxyHandler(IProxyProvider proxyProvider)
        {
            _proxyProvider = proxyProvider;
        }
    
        protected override async Task<httpresponsemessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            // Verificar la URL para un nombre de host específico y configurar el proxy
            if (request.RequestUri.Host.Contains("nombrehost.com"))
            {
                var proxy = _proxyProvider.GetProxyForHostname(request.RequestUri.Host);
                request.Proxy = new WebProxy(proxy.Host, proxy.Port);
            }
    
            return await base.SendAsync(request, cancellationToken);
        }
    }
    

    A continuación, registra el ProxyHandler en el método ConfigureServices de Startup.cs:

    services.AddTransient<proxyhandler>();
    
    services.AddHttpClient<mihttpclient>()
            .AddHttpMessageHandler<proxyhandler>();
    

    En este ejemplo, estamos registrando MiHttpClient con AddHttpClient y añadiendo el ProxyHandler como un DelegatingHandler utilizando AddHttpMessageHandler. El ProxyHandler se ejecutará antes de que las solicitudes se envíen al servidor y configurará el proxy en función de la URL.

    Nota: Dependiendo de tus requisitos específicos, es posible que debas implementar tu propia interfaz IProxyProvider para obtener la configuración del proxy.

    ¿Es válida la solución proporcionada?

    La solución proporcionada de registrar diferentes instancias de HttpClient para cada servicio con sus propios proxies, y un HttpClient con nombre sin proxy, puede funcionar, pero no es la mejor práctica para este escenario. Puede llevar a un código redundante y puede resultar difícil de gestionar a medida que aumenta la cantidad de servicios.

    Utilizar un DelegatingHandler para configurar el proxy en función de la URL es una solución más flexible y escalable.

Comments are closed.