HttpClient
ha sido diseñado para ser reutilizado para múltiples llamadas . Incluso a través de múltiples hilos. El HttpClientHandler
tiene credenciales y las galletas que están destinados a ser reutilizada a través de las llamadas. Tener una nueva HttpClient
instancia requiere volver a configurar todo eso. Además, la DefaultRequestHeaders
propiedad contiene propiedades destinadas a múltiples llamadas. Tener que restablecer esos valores en cada solicitud derrota el punto.
Otro beneficio importante de HttpClient
es la capacidad de agregar HttpMessageHandlers
a la tubería de solicitud / respuesta para aplicar preocupaciones transversales. Estos podrían ser para el registro, la auditoría, la limitación, el manejo de redireccionamiento, el manejo fuera de línea, la captura de métricas. Todo tipo de cosas diferentes. Si se crea un nuevo HttpClient en cada solicitud, entonces todos estos controladores de mensajes deben configurarse en cada solicitud y de alguna manera también se debe proporcionar cualquier estado de nivel de aplicación que se comparta entre las solicitudes de estos controladores.
Cuanto más utilice las funciones HttpClient
, más verá que reutilizar una instancia existente tiene sentido.
Sin embargo, el mayor problema, en mi opinión, es que cuando HttpClient
se elimina una clase, se elimina HttpClientHandler
, lo que luego cierra por la fuerza la TCP/IP
conexión en el conjunto de conexiones que administra ServicePointManager
. Esto significa que cada solicitud con una nueva HttpClient
requiere restablecer una nueva TCP/IP
conexión.
Según mis pruebas, usando HTTP simple en una LAN, el impacto en el rendimiento es bastante insignificante. Sospecho que esto se debe a que hay un keepalive TCP subyacente que mantiene la conexión abierta incluso cuando HttpClientHandler
intenta cerrarla.
En las solicitudes que pasan por Internet, he visto una historia diferente. He visto un impacto de rendimiento del 40% debido a que tengo que volver a abrir la solicitud cada vez.
Sospecho que el golpe en una HTTPS
conexión sería aún peor.
Mi consejo es mantener una instancia de HttpClient durante toda la vida útil de su aplicación para cada API distinta a la que se conecte.
Stopwatch
Sin embargo, no estoy seguro, podría usar la clase para compararla. Mi estimación sería que tiene más sentido tener una solaHttpClient
, suponiendo que todas esas instancias se usen en el mismo contexto.