Cuándo usar WebClient frente a HttpClient frente a HttpWebRequest

Tiene tres opciones diferentes para consumir API REST cuando trabaja en .NET Framework: WebClient, HttpClient y HttpWebRequest. En esta publicación, veremos estas tres formas en las que podemos acceder a las API REST desde el entorno administrado, es decir, sin recurrir a bibliotecas de terceros. En las siguientes secciones, ilustraré estos enfoques con ejemplos de código relevantes para ayudarlo a comprender mejor los conceptos.

En pocas palabras, WebRequest, en su implementación específica de HTTP, HttpWebRequest, representa la forma original de consumir solicitudes HTTP en .NET Framework. WebClient proporciona un contenedor simple pero limitado alrededor de HttpWebRequest. Y HttpClient es la forma nueva y mejorada de realizar solicitudes y publicaciones HTTP, habiendo llegado con .NET Framework 4.5.

Comencemos nuestra discusión con la clase abstracta WebRequest.

System.Net.WebRequest

La clase System.Net.WebRequest es una clase abstracta. Por lo tanto, deberá crear una HttpWebRequest o FileWebRequest para consumir solicitudes HTTP utilizando esta clase. El siguiente fragmento de código muestra cómo puede trabajar con WebRequest.

WebRequest webRequest = WebRequest.Create (uri);

webRequest.Credentials = CredentialCache.DefaultCredentials;

webRequest.Method;

HttpWebResponse webResponse = (HttpWebResponse) webRequest.GetResponse ();

System.Net.HttpWebRequest

WebRequest fue la primera clase proporcionada en .NET Framework para consumir solicitudes HTTP. Le brinda mucha flexibilidad para manejar todos y cada uno de los aspectos de los objetos de solicitud y respuesta, sin bloquear el hilo de la interfaz de usuario. Puede utilizar esta clase para acceder y trabajar con encabezados, cookies, protocolos y tiempos de espera cuando trabaja con HTTP. El siguiente fragmento de código ilustra cómo se puede usar HttpWebRequest.

HttpWebRequest http = HttpWebRequest) WebRequest.Create (“// localhost: 8900 / api / default”);

Respuesta de WebResponse = http.GetResponse ();

MemoryStream memoryStream = response.GetResponseStream ();

StreamReader streamReader = nuevo StreamReader (memoryStream);

cadena de datos = streamReader.ReadToEnd ();

Puede encontrar la documentación de Microsoft en HttpWebRequest aquí. 

System.Net.WebClient

La clase System.Net.WebClient en .NET proporciona una abstracción de alto nivel además de HttpWebRequest. WebClient es solo una envoltura de HttpWebRequest, por lo que usa HttpWebRequest internamente. Por lo tanto, WebClient es un poco lento en comparación con HttpWebRequest, pero requiere que escriba mucho menos código. Puede utilizar WebClient para obtener formas sencillas de conectarse y trabajar con servicios HTTP. Por lo general, es una mejor opción que HttpWebRequest a menos que necesite aprovechar las características adicionales que proporciona HttpWebRequest. El siguiente fragmento de código muestra cómo puede trabajar con WebClient.

datos de cadena = nulo;

usando (var webClient = new WebClient ())

{

    datos = webClient.DownloadString (url);

}

System.Net.Http.HttpClient

HttpClient se introdujo en .NET Framework 4.5. Para los desarrolladores que usan .NET 4.5 o posterior, es la forma preferida de consumir solicitudes HTTP a menos que tenga una razón específica para no usarlo. En esencia, HttpClient combina la flexibilidad de HttpWebRequest y la simplicidad de WebClient, ofreciéndole lo mejor de ambos mundos.

La clase HttpWebRequest proporciona mucho control sobre el objeto de solicitud / respuesta. Sin embargo, debe tener en cuenta que HttpClient nunca fue diseñado para reemplazar a WebClient. Debe usar HttpWebRequest en lugar de HttpClient siempre que necesite las características adicionales que proporciona HttpWebRequest. Además, a diferencia de WebClient, HttpClient carece de soporte para informes de progreso y esquemas URI personalizados. 

Aunque HttpClient no es compatible con FTP, simular y probar HttpClient es más fácil. Todos los métodos enlazados de E / S en HttpClient son asincrónicos y también puede usar la misma instancia de HttpClient para realizar solicitudes simultáneas. El siguiente fragmento de código ilustra cómo puede trabajar con HttpClient.

Tarea asíncrona pública GetAuthorsAsync (string uri)

{

    Autor autor = nulo;

    Respuesta de HttpResponseMessage = aguardar cliente.GetAsync (uri);

    if (response.IsSuccessStatusCode)

    {

        autor = espera respuesta.Content.ReadAsAsync ();

    }

    autor de retorno;

}

Tenga en cuenta que cuando hay un error en la respuesta, HttpClient no genera un error. Más bien, establece la IsSuccessStatusCodepropiedad en false. Si desea lanzar una excepción si la IsSuccessStatusCodepropiedad es falsa, puede realizar una llamada al EnsureSuccessStatusCodemétodo en la instancia de respuesta como se muestra a continuación.

response.EnsureSuccessStatusCode ();

HttpClient fue diseñado para ser instanciado una vez y reutilizado durante el ciclo de vida de la aplicación; no debe crear una nueva instancia de HttpClient para cada solicitud que su aplicación necesita procesar. Si lo hace, los enchufes disponibles podrían agotarse debido al tráfico intenso, lo que provocaría  SocketExceptionerrores. La práctica recomendada es crear una única instancia compartida de HttpClient.