2011-09-11 8 views
13

Sto scrivendo un programma per scaricare la pagina html da un altro sito web. Ho trovato un problema che per un determinato sito Web, non riesco a ottenere il codice html completo. E posso solo ottenere contenuti parziali. Il server con questo problema sta inviando dati in "Transfer-Encoding: chunked" Ho paura che questo sia il motivo del problema.Come ottenere il contenuto completo da HttpWebResponse se il contenuto di ritorno è Transfer-Encoding: chunked?

Questo le informazioni di intestazione restituito dal server:

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 

Ecco il mio codice:

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(); 
} 

posso solo ottenere il codice html parziale (credo che sia il primo pezzo dal server). Qualcuno potrebbe aiutare? Qualche soluzione?

Grazie!

+0

HttpWebResponse sa già come gestire i dati chunked. Ciò che non puoi ignorare è ContentEncoding. Supponi utf8 nella chiamata del costruttore StreamReader, questo andrà storto quando non lo è. –

+0

Ciao Hans Passant, grazie per i vostri commenti. Confermo che la pagina web è con codifica UTF8. Provo a cambiare l'impostazione di codifica in StreamReader in ASCII, sempre lo stesso risultato, se cambi in Unicode, tutto il contenuto è codice illeggibile. – syking

+0

@HansPassant A quanto pare ho lo stesso problema ma passare la codifica nel costruttore StreamReader non sembra essere di aiuto. Ho anche provato a copiare ResponseStream su MemoryStream e creare uno StreamReader per tutte le possibili codifiche e nessuno di loro sembrava essere in grado di scaricare completamente tutti i blocchi. Qualche idea? –

risposta

-1

se ho capito quello che stai chiedendo è possibile farlo leggere riga per riga

string htmlLine = reader.ReadLine(); 
9

Non è possibile utilizzare ReadToEnd per leggere i dati Chunked. È necessario leggere direttamente dal flusso di risposta utilizzando 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

Questa risposta funziona ma ha il codice mancante. La variabile denominata "conteggio" non è stata definita. Se definisci la variabile e imposta il valore con buf.Length anziché aggiungere "count--" nel ciclo while, funzionerà. – bafsar

+0

@bafsar Dovrebbe essere fatto meglio utilizzando response.ContentLength come segue Byte [] buf = new byte [response.ContentLength]; per ottenere la lunghezza del buffer corretta – Redeemed1

+0

@ Redeemed1 non c'è ContentLength impostato con Transfer-Encoding: chunked – GeorgeChond

Problemi correlati