2011-09-11 10 views
13

Estoy escribiendo un programa para descargar la página html desde otro sitio web. Encontré un problema que para un determinado sitio web, no puedo obtener el código html completo. Y solo puedo obtener contenido parcial. El servidor con este problema está enviando datos en "Transferencia de codificación: fragmentada" Me temo que este es el motivo del problema.Cómo obtener el contenido completo de HttpWebResponse si el contenido devuelto es Transfer-Encoding: chunked?

Esta la información del encabezado devuelta por el servidor:

Transfer-Encoding: chunked 
Connection: keep-alive 
Pragma: no-cache 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Content-Type: text/html; charset=UTF-8 
Date: Sun, 11 Sep 2011 09:46:23 GMT 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Server: nginx/1.0.6 

Aquí está mi código:

HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; 
HttpWebResponse response; 
CookieContainer cookie = new CookieContainer(); 
request.CookieContainer = cookie; 
request.AllowAutoRedirect = true; 
request.KeepAlive = true; 
request.UserAgent = 
    @"Mozilla/5.0 (Windows NT 6.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2 FirePHP/0.6"; 
request.Accept = @"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
string html = string.Empty; 
response = request.GetResponse() as HttpWebResponse; 

using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
{ 
    html = reader.ReadToEnd(); 
} 

sólo puedo obtener el código html parcial (creo que es el primer trozo del servidor). ¿Alguien podría ayudar? ¿Alguna solución?

Gracias!

+0

HttpWebResponse ya sabe cómo tratar los datos fragmentados. Lo que no puede ignorar es ContentEncoding. Usted asume que utf8 en su llamada al constructor de StreamReader, esto no funcionará correctamente. –

+0

Hola Hans Passant, gracias por tus comentarios. Confirmo que la página web está con codificación UTF8. Intento cambiar la configuración de codificación en StreamReader a ASCII, sigue siendo el mismo resultado, si cambio a Unicode, todo el contenido es código ilegible. – syking

+0

@HansPassant Tengo el mismo problema aparentemente, pero pasar la codificación en el constructor de StreamReader no parece ayudar. También intenté copiar el ResponseStream a un MemoryStream y crear un StreamReader para toda la codificación posible y ninguno de ellos parecía capaz de volcar completamente todos los fragmentos. ¿Alguna idea? –

Respuesta

-1

si he entendido lo que preguntas que puede hacer que la lectura línea por línea

string htmlLine = reader.ReadLine(); 
9

No se puede utilizar para leer datos ReadToEnd fragmentada. Debe leer directamente de la secuencia de respuesta utilizando GetBytes.

StringBuilder sb = new StringBuilder(); 
Byte[] buf = new byte[8192]; 
Stream resStream = response.GetResponseStream(); 

do 
{ 
     count = resStream.Read(buf, 0, buf.Length); 
     if(count != 0) 
     { 
          sb.Append(Encoding.UTF8.GetString(buf,0,count)); // just hardcoding UTF8 here 
     } 
}while (count > 0); 
String html = sb.ToString(); 
+0

Esta respuesta funciona, pero le falta el código. La variable llamada 'conteo' no ha sido definida. Si define la variable y establece el valor con buf.Length en lugar de agregar 'count--' en el ciclo while, funcionará. – bafsar

+0

@bafsar Debería hacerse mejor usando response.ContentLength como sigue Byte [] buf = new byte [response.ContentLength]; para obtener la longitud de búfer correcta – Redeemed1

+0

@ Redeemed1 no hay ContentLength configurado con Transfer-Encoding: fragmentado – GeorgeChond

Cuestiones relacionadas