c# - .NET: WebBrowser, WebClient, WebRequest, HTTPWebRequest... ¡ARGH!
system.net (4)
En el espacio de nombres System.Net, hay muchas clases diferentes con nombres similares, tales como:
- WebBrowser y WebClient
- WebRequest y HTTPWebRequest
- WebResponse y HTTPWebResponse
Esos son los principales que me interesan.
¿Cuál es la función de cada uno? ¿En qué se diferencian unos de otros?
Además, ¿en qué casos utilizarías cuál?
No conozco ningún System.Net.WebBrowser, pero WebClient es básicamente una clase que le permite descargar fácilmente archivos (incluyendo páginas html) de la web a la memoria o incluso directamente a los archivos. Un ejemplo de código básico se ve así:
string html;
using (var wc = new WebClient())
{
html = wc.DownloadString("http://.com/questions/1780679/");
}
Puedes hacer mucho con WebClient, pero hay algunas limitaciones. Si necesita realizar un raspado web serio, deberá obtener un nivel inferior. Ahí es donde entra HttpWebRequest / HttpWebResponse. Puede usarlos para enviar cualquier solicitud que un navegador web normal pueda enviar, en cualquier secuencia. Por ejemplo, es posible que deba autenticarse con un sitio web antes de poder solicitar la página que realmente desea, y WebClient no podrá hacerlo. HttpWebRequest lo hará.
Ahora, hay otra opción. System.Windows.Forms.WebBrowser es un control diseñado para colocar en un formulario. Básicamente envuelve el motor utilizado en Internet Explorer para proporcionar todas las capacidades de un navegador web. Debe tener cuidado al usar esto para el raspado general: no es portátil (malo para mono), usa muchos recursos, tiene problemas de seguridad similares a los de un navegador completo y tiene efectos secundarios como fugas de ventanas emergentes. El control se utiliza mejor en un formulario para conectarse a un recurso web conocido específico. Por ejemplo, puede tener una aplicación de Windows Forms en venta y una aplicación web donde la vende para descargarla. Puede proporcionar un control WebBrowser que muestre algunas páginas de este sitio web específicamente diseñado para ver en su aplicación y que permita a los usuarios comprar actualizaciones dentro de la aplicación.
WebClient es una forma bastante buena de obtener la página HTML. Aquí está el fragmento de código para descargar una cadena de respuesta.
string getHtmlPageUsingWC(string strQuery, System.Net.WebProxy proxy = null)
{
string strResponse = String.Empty;
using (WebClient wc = new WebClient())
{
wc.Encoding = Encoding.UTF8;
IWebProxy wp = WebRequest.DefaultWebProxy;
wp.Credentials = CredentialCache.DefaultCredentials;
wc.Proxy = wp;
wc.Headers.Add("Accept-Language:en");
NameValueCollection nvc = new NameValueCollection();
nvc.Add("q", strQuery);
wc.QueryString.Add(nvc);
try
{
strResponse = wc.DownloadString(m_strURL);
}
catch (Exception ex)
{
strResponse = "Request Declined: " + ex.Message;
Console.WriteLine(ex.Message);
}
}
return strResponse;
}
WebRequest y WebResponse son clases abstractas. HTTPWebRequest y HTTPWebResponse son implementaciones de ellos.
WebBrowser está realmente en el espacio de nombres System.Windows.Forms y es un control visual que puede agregar a un formulario. Es principalmente una envoltura alrededor del navegador Internet Explorer (MSHTML). Le permite visualizar e interactuar fácilmente mediante programación con una página web. Llama al método Navigate pasando una URL web, espere a que se complete la descarga y se muestre y luego interactúe con la página utilizando el modelo de objeto que proporciona.
HttpWebRequest es una clase concreta que le permite solicitar en código cualquier tipo de archivo a través de HTTP. Por lo general, lo recibe como una secuencia de bytes. Lo que haga después de eso depende de su aplicación.
HttpWebResponse le permite procesar la respuesta de un servidor web que se solicitó anteriormente mediante HttpWebRequest.
WebRequest y WebResponse son las clases base abstractas que heredan HttpWebRequest y HttpWebResponse. No puedes crearlos directamente. Otras clases que heredan de estas incluyen clases Ftp y File.
WebClient Siempre lo he visto como una buena clase de ayuda que proporciona formas más sencillas de, por ejemplo, descargar o cargar un archivo desde una URL web. (Por ejemplo, los métodos DownloadFile y DownloadString). He escuchado que en realidad usa HttpWebRequest / HttpWebResponse detrás de escena para ciertos métodos.
Si necesita un control más preciso sobre las solicitudes y respuestas web, HttpWebRequest / HttpWebResponse es probablemente el camino a seguir. De lo contrario, WebClient es generalmente más simple y hará el trabajo.