2011-01-21 14 views
20

Tengo una página web que no tiene nada excepto algunas cadenas. Sin imágenes, sin color de fondo ni nada, solo texto simple que no es tan largo.Leyendo datos de un sitio web usando C#

Me pregunto, ¿cuál es la mejor (es decir, la forma más rápida y eficiente) de pasar la cadena en la página web para poder usarla para otra cosa (por ejemplo, mostrarla en un cuadro de texto)? Conozco WebClient, pero no estoy seguro de si hará lo que quiero que haga y, además, ni siquiera quiero probarlo, incluso si funcionó porque la última vez que lo hice tardó aproximadamente 30 segundos para una operación simple.

Cualquier idea sería apreciada.

+1

La clase WebClient es la elección natural aquí. El cliente web no debe tardar 30 segundos en ejecutarse (suponiendo que no haya otros problemas de red). – Jimmy

+1

Sus opciones están limitadas a WebClient o WebRequest/WebResponse (que es lo que WebClient usa debajo de las escenas, así que simplemente vaya a WebClient).En cuanto a por qué es lento, esto es algo que no tiene nada que ver con la implementación de la pila .NET HTTP. Podría tratarse de problemas de red, una implementación deficiente del sitio web que está tratando de recuperar, lo que hace que sea más lento devolver una respuesta, ... Por ejemplo, ejecutar un cliente web en un sitio web correctamente escrito, como http://www.google .com tarda unos pocos milisegundos en obtener la respuesta que es mucho menor que los 30 segundos que está observando en su sitio. –

+0

Por pase, ¿significa su análisis medio? si es así, ¿con qué tecnología lo estás analizando? es decir, ¿qué tipo de cuadro de texto de win-forms, otro sitio web? – Rob

Respuesta

25

La clase WebClient debe ser más que capaz de manejar la funcionalidad que usted describe, por ejemplo:

System.Net.WebClient wc = new System.Net.WebClient(); 
byte[] raw = wc.DownloadData("http://www.yoursite.com/resource/file.htm"); 

string webData = System.Text.Encoding.UTF8.GetString(raw); 

o (más a la sugerencia de Fredrick en los comentarios)

System.Net.WebClient wc = new System.Net.WebClient(); 
string webData = wc.DownloadString("http://www.yoursite.com/resource/file.htm"); 

Cuando usted dice que tomó 30 segundos, ¿puede ampliar eso un poco más? Hay muchas razones de por qué eso pudo haber sucedido. servidores lentos, conexiones a Internet, la aplicación poco fiables, etc, etc

Usted podría ir un nivel más bajo e implementar algo como esto:

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("http://www.yoursite.com/resource/file.htm"); 

using (StreamWriter streamWriter = new StreamWriter(webRequest.GetRequestStream(), Encoding.UTF8)) 
{ 
    streamWriter.Write(requestData); 
} 

string responseData = string.Empty; 
HttpWebResponse httpResponse = (HttpWebResponse)webRequest.GetResponse(); 
using (StreamReader responseReader = new StreamReader(httpResponse.GetResponseStream())) 
{ 
    responseData = responseReader.ReadToEnd(); 
} 

Sin embargo, al final del día, la clase WebClient envuelve esta funcionalidad para tú. Entonces, le sugiero que use WebClient e investigue las causas del retraso de 30 segundos.

+2

Alternativamente, use el método [DownloadString] (http://msdn.microsoft.com/sv-se/library/fhd1f0sw.aspx) y elimine el manejo de la matriz de bytes: 'string result = wc.DownloadString (... ' –

+1

Codifiqué un botón que salvaría una página (aunque una que tuviera bastante tráfico) usando la clase WebClient y luego reemplacé algunos contenidos en un archivo con algunos de los contenidos de la página. Utilicé un cronómetro. tomó mucho tiempo y varió de 10 a 40. La conexión a Internet puede haber sido mala, pero dudo que haya sido la razón principal. Desafortunadamente ya no tengo el código para ese botón, de lo contrario lo habría publicado.: \ – Iceyoshi

+0

@Fredrik : +1 para la sugerencia DownloadString – MrEyes

5

Si está descargando el texto a continuación, le recomiendo usar el cliente Web y conseguir un StreamReader para el texto:

 WebClient web = new WebClient(); 
     System.IO.Stream stream = web.OpenRead("http://www.yoursite.com/resource.txt"); 
     using (System.IO.StreamReader reader = new System.IO.StreamReader(stream)) 
     { 
      String text = reader.ReadToEnd(); 
     } 

Si esto está tomando mucho tiempo, entonces es probablemente un problema de red o un problema en el servidor web. Intente abrir el recurso en un navegador y vea cuánto demora eso. Si la página web es muy grande, es posible que desee ver la transmisión en trozos en lugar de leer hasta el final como en ese ejemplo. Mire http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx para ver cómo leer de una secuencia.

1

cuanto a la sugerencia Así que le sugiero que utilice cliente Web e investigar las causas de la demora de 30 segundos.

partir de las respuestas de la pregunta System.Net.WebClient unreasonably slow

configuración del proxy = null Try;

WebClient wc = new WebClient(); wc.Proxy = null;

crédito a Alex Burtsev

0
WebClient client = new WebClient(); 
      using (Stream data = client.OpenRead(Text)) 
      { 
       using (StreamReader reader = new StreamReader(data)) 
       { 
        string content = reader.ReadToEnd(); 
        string pattern = @"((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)"; 
        MatchCollection matches = Regex.Matches(content,pattern); 
        List<string> urls = new List<string>(); 
        foreach (Match match in matches) 
        { 
          urls.Add(match.Value); 
        } 

       } 
Cuestiones relacionadas