¿Qué diferencia hay entre las clases WebClient y HTTPWebRequest en .NET?

178

¿Qué diferencia hay entre WebClientlas HttpWebRequestclases y en .NET? Ambos hacen cosas muy similares. De hecho, por qué no se fusionaron en una clase (demasiados métodos / variables, etc. pueden ser una razón, pero hay otras clases en .NET que rompen esa regla).

Gracias.

GurdeepS
fuente

Respuestas:

242

WebClient es una abstracción de nivel superior construida sobre HttpWebRequest para simplificar las tareas más comunes. Por ejemplo, si desea obtener el contenido de un HttpWebResponse, debe leer el flujo de respuesta:

var http = (HttpWebRequest)WebRequest.Create("http://example.com");
var response = http.GetResponse();

var stream = response.GetResponseStream();
var sr = new StreamReader(stream);
var content = sr.ReadToEnd();

Con WebClient, solo haces DownloadString:

var client = new WebClient();
var content = client.DownloadString("http://example.com");

Nota: omití las usingdeclaraciones de ambos ejemplos por brevedad. Definitivamente, debe tener cuidado de deshacerse de sus objetos de solicitud web correctamente.

En general, WebClient es bueno para solicitudes simples rápidas y sucias y HttpWebRequest es bueno para cuando necesita más control sobre toda la solicitud.

John Sheehan
fuente
34
Lo anterior es un hecho, lo siguiente es una opinión: ambos son terribles porque HttpWebRequest está roto. Maneja incorrectamente la autenticación básica, requiere soluciones extrañas ServicePointManager.Expect100Continue = false, hacer otras cosas no estándar y tener muchas peculiaridades e idiosincrasias. Comencé RestSharp para ayudar a suavizar esos problemas.
John Sheehan
44
También tenga en cuenta que WebClient es un componente, por lo que puede arrastrarlo / soltarlo desde la ventana de herramientas de VS en su formulario y poder usarlo allí.
congeló
1
Creo que intenté usar httpwebrequest con autenticación básica hace un tiempo. Puedo estar de acuerdo con eso. ¿Entonces hiciste RestSharp? ¡Frio!
GurdeepS
19
Cualquiera que se encuentre con esto como lo acabo de hacer ahora, tenga en cuenta que hay un nuevo jugador en el campo llamado HttpClientque viene con .NET 4.5 que puede (o puede que no) resolver algunas de las molestias anteriores ...
Funka
3
WebClient implementa IDisposable, por lo que debe considerar hacerlousing (WebClient client = new WebClient())
Eric
32

Además, WebClient no tiene propiedad de tiempo de espera. Y ese es el problema, porque el valor predeterminado es 100 segundos y eso es demasiado para indicar si no hay conexión a Internet.

La solución para ese problema está aquí https://stackoverflow.com/a/3052637/1303422

Andriy F.
fuente
16
La pregunta era cuál es la diferencia. Una de las diferencias es que WebClient no tiene una propiedad de tiempo de espera mientras que HttpWebRequest sí.
Andriy F.
26

Sé que es demasiado tiempo para responder, pero solo como un propósito de información para futuros lectores:

WebRequest

System.Object
    System.MarshalByRefObject
        System.Net.WebRequest

El WebRequestes una clase base abstracta. Así que en realidad no lo usas directamente. Lo usas a través de sus clases derivadas, HttpWebRequestyFileWebRequest .

Utiliza el método Create de WebRequestpara crear una instancia de WebRequest. GetResponseStreamdevolucionesdata stream .

También hay FileWebRequesty FtpWebRequestclases que inheritdesde WebRequest. Normalmente, solía WebRequest, bueno, hacer una solicitud y convertir la devolución a cualquiera HttpWebRequest, FileWebRequestoFtpWebRequest depender de su solicitud. A continuación se muestra un ejemplo:

Ejemplo:

var _request = (HttpWebRequest)WebRequest.Create("http://stackverflow.com");
var _response = (HttpWebResponse)_request.GetResponse();

Cliente web

System.Object
        System.MarshalByRefObject
            System.ComponentModel.Component
                System.Net.WebClient

WebClientproporciona operaciones comunes sendingy receivingdatos de un recurso identificado por a URI. Simplemente, es una abstracción de nivel superior de HttpWebRequest. Estas "operaciones comunes" es lo que diferencia WebClientdeHttpWebRequest , como también se muestra en el ejemplo siguiente:

Ejemplo:

var _client = new WebClient();
var _stackContent = _client.DownloadString("http://stackverflow.com");

También hay DownloadDatay DownloadFileoperaciones bajo WebClientinstancia. Estas operaciones comunes también simplifican el código de lo que normalmente haríamos HttpWebRequest. Usando HttpWebRequest, tenemos que obtener la respuesta de nuestra solicitud, instanciarStreamReader para leer la respuesta y finalmente, convertir el resultado al tipo que esperamos. Con WebClient, simplemente llamamosDownloadData, DownloadFile or DownloadString .

Sin embargo, tenga en cuenta que WebClient.DownloadString no considera elencoding el recurso que está solicitando. Por lo tanto, probablemente terminaría recibiendo caracteres extraños si no especifica y codifica.

NOTA: Básicamente " WebClient toma pocas líneas de código en comparación con Webrequest "

SHEKHAR SHETE
fuente
¿La clase WebClient utiliza el método Post / Get? Proporcione un enlace para describir
Kartiikeya 01 de
WebRequest nos permite agregar el tipo de Método de solicitud, es decir, Obtener / Publicar con un MÉTODO de propiedad. donde como WebClient no tiene ningún tipo de método que agregue funcionalidad.
SHEKHAR SHETE
1
@SHEKHARSHETE que pude usar webClient.UploadData(url, "POST", bytes)para especificar el método (ver documentos de MSDN ).
Jeff B