2015-09-02 5 views
0

Я не знаю, но длина содержимого всегда отрицательная, даже если у ответа есть заголовок Content-Length. Например:Длина контента всегда отрицательная

class Program 
{ 
    static void Main() 
    { 
     try 
     { 
      string result = Get("http://stackoverflow.com/"); 
      Console.WriteLine("Response length = {0}", result.Length); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 

    static string Get(string adr) 
    { 
     HttpWebRequest req = (HttpWebRequest)WebRequest.Create(adr); 
     req.UserAgent = "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0"; 
     req.Proxy = null; 
     req.KeepAlive = false; 
     req.Headers.Add("Accept-Language", "ru-RU,ru;q=0.9,en;q=0.8"); 
     req.AllowAutoRedirect = true; 
     req.Timeout = 10000; 
     req.ReadWriteTimeout = 10000; 
     req.MaximumAutomaticRedirections = 10; 
     req.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 
     req.Method = WebRequestMethods.Http.Get; 


     using (var response = (HttpWebResponse) req.GetResponse()) 
     { 
      using (var stream = response.GetResponseStream()) 
      { 
       if (stream == null) 
        throw new NullReferenceException("Response stream is nulL!"); 
       using (var reader = new StreamReader(stream, Encoding.Default)) 
       { 
        Console.WriteLine("Content length = {0}", response.ContentLength); 
        return WebUtility.HtmlDecode(reader.ReadToEnd()); 
       } 
      } 
     } 
    } 
} 

Скрипач показывает следующий вывод:

HTTP/1.1 200 OK 
Date: Wed, 02 Sep 2015 20:36:42 GMT 
Content-Type: text/html; charset=utf-8 
Connection: keep-alive 
Cache-Control: private, max-age=0 
Cf-Railgun: fe8c0e42fd 44.42 0.042796 0030 3350 
X-Frame-Options: SAMEORIGIN 
X-Request-Guid: bc3ccb1f-1de5-4375-b30d-f3c89134cf86 
Server: cloudflare-nginx 
CF-RAY: 21fc0233f6652bca-AMS 
Content-Length: 251540 

Но в программе я получаю это:

enter image description here

как она может быть исправлена?

+0

1) Когда длина содержимого отсутствует в ответе сервера, она будет равна -1 в соответствии с Httpresponse.ContentLenght на MSDN 2) Fiddler, вероятно, использовал метод, аналогичный вашему, чтобы получить фактический счет, но вы получаете 240427 против 251540, потому что ответ является UTF-8, тогда как .Net-строки - UTF-16. Такие вещи будут отбрасывать string.lenght в вашем Main() – Mystra007

ответ

3

Пара вещей:

Когда я пытаюсь, stackoverflow.com не устанавливает заголовок Content-Length, поэтому он придет через как -1.

Но, изменив URL-адрес, чтобы использовать сервер, который определенно устанавливает заголовок Content-Length, например, www.theguardian.com, все равно дает тот же результат: -1.

Я думаю, что это ваше использование AutomaticDecompression на объекте HttpWebRequest.

Если вы не установили это свойство, свойство ContentLength произойдет правильно.

0

Это означает, что именно Fidder возвращает длину содержимого. Причина, по которой Fiddler будет делать это, заключается в том, что у вас нажата кнопка «Стрим» (или какой-то другой путь, чтобы указать скрипачу, что вы хотите вернуть данные «Поток» или «Чанка»).

Когда сервер возвращает данные «Chunked» , он устанавливает длину контента в -1 - вы не знаете длину содержимого, так как у вас могут быть неограниченные фрагменты.

Если вы отключаете (или выключаете) потоковое воспроизведение, то fiddler возвращает свой буфер по умолчанию 'ответ, который является точной копией ответа от сервера, который, конечно, будет включать заголовок Content-Length.

Буквально только что прошел через это - HTH!