Contexto
En arquitecturas de microservicios o al integrar servicios externos, el uso incorrecto de HttpClient es uno de los errores más frecuentes en proyectos .NET. Problemas como la falta de reutilización de conexiones, la ausencia de manejo de excepciones y la configuración duplicada son patrones que aparecen repetidamente y que tienen consecuencias reales en producción.
El problema
El punto de partida es un PersonService que instancia HttpClient directamente en cada método: sin gestión del ciclo de vida, sin manejo de excepciones, sin centralización de configuración. Cada llamada crea una nueva instancia, lo que genera agotamiento de sockets y problemas de rendimiento difíciles de diagnosticar.
public async Task<ExternalResponse<GetPersonResponse>> GetName(string name)
{
HttpClient client = new();
client.BaseAddress = new Uri("https://api.genderize.io");
var response = await client.GetAsync($"/?name={name}");
// sin manejo de excepciones, sin reutilización
}
La solución
El repositorio documenta la evolución desde ese código problemático hasta una implementación lista para producción, en tres etapas:
IHttpClientFactory con cliente nombrado — centraliza la configuración (base URL, timeout) en el registro de dependencias y gestiona el ciclo de vida de las instancias automáticamente. El servicio recibe la factory por inyección y crea clientes con CreateClient().
Logging personalizado con HttpLoggerHandler — un HttpMessageHandler propio reemplaza los cuatro logs estándar de ASP.NET por dos entradas estructuradas que capturan método, URI, headers y body de request y response, facilitando el diagnóstico operativo.
Resiliencia con Polly — se agrega una política de reintentos (2 intentos con intervalo de 1 segundo) que se encadena al HttpClient via AddPolicyHandler. El handler de logging y la política de resiliencia se componen en la misma configuración:
services.AddHttpClient(HttpConstants.ClientName, client =>
{
client.BaseAddress = new Uri(externalUrl);
client.Timeout = TimeSpan.FromSeconds(15);
})
.AddHttpMessageHandler<HttpLoggerHandler>()
.AddPolicyHandler((IAsyncPolicy<HttpResponseMessage>)retryPolicy);
Tecnologías
- .NET / ASP.NET Core — framework base y configuración de servicios
- C# — implementación con primary constructors y using blocks
- IHttpClientFactory — gestión del ciclo de vida de HttpClient
- Polly — políticas de resiliencia: retry con backoff
- HttpMessageHandler — pipeline de mensajes para logging personalizado
- Docker — containerización del ejemplo