.Net Core HttpClientFactory para varios servicios de API

Sep 10 2020

Tengo un proyecto .Net Core que necesita conectarse a alrededor de 4 servicios de API diferentes, no soy un experto en ninguno de los códigos de HttpClient, pero por lo que encontré, fue que generalmente solo querría reutilizar una instancia de su HttpClient. Por lo que puedo decir, el consenso general es usar HttpClientFactory en .Net Core registrándolo en su clase de inicio y luego solicitándolo usando DI.

Ahora, la mayoría de mis encabezados predeterminados y demás son todos generalmente iguales además de la URL BaseAddress, ¿cómo debo hacer esto cuando me conecto a los servicios de API 4 diff? ¿Debo registrar 4 clientes con nombres diferentes o tener un cliente con toda la información predeterminada preestablecida y luego configurarlo manualmente según sea necesario, por ejemplo, configurar la dirección?

Las preguntas generales serían, como soy bastante nuevo en esto, se dice que se reutiliza una instancia de un HttpClient.

  1. Si creo 4 clientes con nombres diferentes para cada servicio de API, ¿no crearía esto 4 instancias de HttpClient cuando llamo al método .CreateClient ()?
  2. .CreateClient () crea una nueva instancia cada vez que se llama, ¿no anula esto el propósito de tener una instancia de HttpClient si digo que necesito hacer 3 llamadas diferentes a un servicio de API, cada una de esas llamadas llamará a. CreateClient () para establecer algún tipo de conexión y eso creará 3 instancias de HttpClient?

Se agradecería cualquier ayuda para mayor claridad,

¡Gracias!

Respuestas

2 scharnyw Sep 10 2020 at 14:01

El propósito de usar IHttpClientFactoryno es reutilizar instancias de HttpClient. En cambio, es reutilizar (agrupando) instancias de HttpMessageHandler(en realidad HttpClientHandler, que se deriva del resumen HttpMessageHandler) que es el objeto subyacente que administra las conexiones y sockets HTTP. Este diagrama de Microsoft Docs lo muestra bien.

Le preocupaba que las llamadas frecuentes a IHttpClientFactory.CreateClient()crearían el mismo problema que las llamadas frecuentes a new HttpClient(). Sin embargo, éste no es el caso. Como explica Microsoft docs , la razón por la que las llamadas frecuentes a new HttpClient()resultarán en el agotamiento del socket es que este constructor creará una nueva instancia de HttpMessageHandler:

Sin embargo, el problema no es realmente con HttpClient per se, sino con el constructor predeterminado para HttpClient, porque crea una nueva instancia concreta de HttpMessageHandler, que es la que tiene problemas de agotamiento de sockets y cambios de DNS mencionados anteriormente.

Puede ver en el código fuente de IHttpClientFactoryque no usa el constructor sin parámetros de HttpClientin CreateClient(). En cambio, obtiene el HttpMessageHandlerde un grupo y lo inyecta en el creado HttpClient.

Ya sea que esté usando clientes escritos o con nombre, debe usar la instancia de HttpClient como si fuera un objeto transitorio: es barato de crear y no necesita almacenarlo en caché durante largos períodos de tiempo.