Подтвердить что ты не робот

Как получить полный контент из HttpWebResponse, если возвращаемым контентом является Transfer-Encoding: chunked?

Я пишу программу для загрузки html-страницы с другого сайта. Я нашел проблему, которая для некоторого определенного веб-сайта, я не могу получить полный код html. И я могу получить только частичный контент. Сервер с этой проблемой отправляет данные в "Transfer-Encoding: chunked" Я боюсь, что это и есть причина проблемы.

Информация заголовка, возвращаемая сервером:

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

Вот мой код:

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

Я могу получить только частичный html-код (я думаю, что это первый фрагмент с сервера). Может ли кто-нибудь помочь? Любое решение?

Спасибо!

4b9b3361

Ответ 1

Вы не можете использовать ReadToEnd для чтения фрагментированных данных. Вы должны читать непосредственно из потока ответов с помощью 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();

Ответ 2

Попробовав множество фрагментов из StackOverflow и Google, в конечном итоге я обнаружил, что это работает лучше всего (при условии, что вы знаете данные в виде строки UTF8, если нет, вы можете просто сохранить байтовый массив и обработать его соответствующим образом):

byte[] data;
var responseStream = response.GetResponseStream();
var reader = new StreamReader(responseStream, Encoding.UTF8);
data = Encoding.UTF8.GetBytes(reader.ReadToEnd());
return Encoding.Default.GetString(data.ToArray());

Я обнаружил, что большую часть времени работают другие варианты, но иногда усекают данные. Я получил этот фрагмент от:

https://social.msdn.microsoft.com/Forums/en-US/4f28d99d-9794-434b-8b78-7f9245c099c4/problems-with-httpwebrequest-and-transferencoding-chunked?forum=ncl

Ответ 3

если я понял, о чем вы просите, вы можете это делать по строкам

string htmlLine = reader.ReadLine();