Comment obtenir le contenu complet de HttpWebResponse si le contenu renvoyé est Transfer-Encoding: chunked?

J’écris un programme pour télécharger la page html depuis un autre site. J’ai trouvé un problème qui pour un site Web en particulier, je ne peux pas obtenir le code HTML complet. Et je ne peux obtenir qu’un contenu partiel. Le serveur avec ce problème envoie des données dans “Transfer-Encoding: chunked” Je crains que ce ne soit la cause du problème.

Voici les informations d’en-tête renvoyées par le serveur:

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 

Voici mon code:

 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"; ssortingng html = ssortingng.Empty; response = request.GetResponse() as HttpWebResponse; using (StreamReader reader = new StreamReader(response.GetResponseStream())) { html = reader.ReadToEnd(); } 

Je ne peux obtenir que du code HTML partiel (je pense que c’est le premier morceau du serveur). Quelqu’un pourrait-il aider? Toute solution?

Merci!

Vous ne pouvez pas utiliser ReadToEnd pour lire des données fragmentées. Vous devez lire directement à partir du stream de réponses à l’aide de GetBytes.

 SsortingngBuilder sb = new SsortingngBuilder(); Byte[] buf = new byte[8192]; Stream resStream = response.GetResponseStream(); do {   count = resStream.Read(buf, 0, buf.Length);   if(count != 0)   {     sb.Append(Encoding.UTF8.GetSsortingng(buf,0,count)); // just hardcoding UTF8 here   } }while (count > 0); Ssortingng html = sb.ToSsortingng(); 

si j’ai compris ce que vous demandez, vous pouvez le faire en lisant ligne par ligne

 ssortingng htmlLine = reader.ReadLine();