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!
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 è. –
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
@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? –