Exploración de clientes HTTP en .NET Core
El Protocolo de transferencia de hipertexto (o HTTP) se usa para solicitar recursos de un servidor web. Muchos tipos de recursos están disponibles en la web y HTTP define un conjunto de métodos de solicitud para acceder a estos recursos. En .NET Core, esas solicitudes se realizan a través de una instancia de HttpClient.
Hay dos opciones para implementar HttpClient en la aplicación y la recomendación es elegir la implementación en función de las necesidades de administración de la duración de los clientes:
- Para clientes longevos, cree una instancia
statico singleton mediante la claseHttpClienty establezcaPooledConnectionLifetime - En el caso de los clientes de corta duración, use los clientes creados por
IHttpClientFactory
Implementación con la clase HttpClient
La clase System.Net.Http.HttpClient envía solicitudes HTTP y recibe respuestas HTTP de un recurso identificado mediante un URI. Una instancia HttpClient es una colección de opciones de configuración aplicadas a todas las solicitudes ejecutadas por esa instancia, y cada instancia usa su propio grupo de conexiones, que aísla sus solicitudes de otros usuarios. A partir de .NET Core 2.1, la clase SocketsHttpHandler proporciona la implementación, lo que hace que el comportamiento sea coherente en todas las plataformas.
HttpClient solo resuelve las entradas DNS cuando se crea una conexión. No realiza ningún seguimiento de las duraciones de período de vida (TTL) especificadas por el servidor DNS. Si las entradas DNS cambian con regularidad, el cliente no está al tanto de esas actualizaciones. Para resolver este problema, puede limitar la duración de la conexión mediante la configuración de la propiedad PooledConnectionLifetime, de modo que la búsqueda de DNS sea obligatoria cuando se reemplace la conexión.
En el siguiente ejemplo, HttpClient se configura para reutilizar las conexiones durante 15 minutos. Una vez transcurrido TimeSpan especificado por PooledConnectionLifetime, la conexión se cierra y se crea una nueva.
var handler = new SocketsHttpHandler
{
PooledConnectionLifetime = TimeSpan.FromMinutes(15) // Recreate every 15 minutes
};
var sharedClient = new HttpClient(handler);
Implementación con IHttpClientFactory
IHttpClientFactory funciona como una abstracción de fábrica que puede crear instancias HttpClient con opciones de configuración personalizadas.
IHttpClientFactory se presentó en .NET Core 2.1. Las cargas de trabajo de .NET comunes basadas en HTTP pueden aprovechar con facilidad el middleware.
Cuando llama a cualquiera de los métodos de extensión AddHttpClient, está agregando IHttpClientFactory y los servicios relacionados a IServiceCollection. El tipo IHttpClientFactory ofrece los siguientes beneficios:
- Exprese la clase
HttpClientcomo un tipo de dependencia listo para la inyección. - Proporciona una ubicación central para denominar y configurar instancias de
HttpClientlógicas. - Codifica el concepto de middleware de salida a través de la delegación de controladores en
HttpClient. - Proporciona métodos de extensión para middleware basado en Polly para aprovechar las ventajas de la delegación de gestores en
HttpClient. - Administra el almacenamiento en caché y la duración de las instancias HttpClientHandler subyacentes. La administración automática evita los problemas comunes del Sistema de nombres de dominio (DNS) que se producen al administrar la duración de
HttpClientde forma manual. - Agrega una experiencia de registro configurable para todas las solicitudes enviadas a través de los clientes creados por la fábrica.
Debe permitir que HttpClientFactory y el marco administren las duraciones y la creación de instancias de HttpClient. La administración de la duración le ayuda a evitar problemas comunes, como los problemas de DNS (sistema de nombres de dominio) que pueden producirse al administrar manualmente las duraciones HttpClient.
IHttpClientFactory se puede usar de varias formas en una aplicación:
El mejor enfoque depende de los requisitos de la aplicación.