C # Не получает правильный ответ от HttpWebResponse. Кодирование? - PullRequest
2 голосов
/ 20 ноября 2010

Я пытаюсь получить некоторые веб-страницы, используя код ниже:

    public static string FetchPage(string url)
    {

         HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);

        req.Method = "GET";

        req.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.0; sv-SE; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 (.NET CLR 3.5.30729";
        req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
        req.Headers.Add("Accept-Language", "sv-se,sv;q=0.8,en-us;q=0.5,en;q=0.3");
        req.Headers.Add("Accept-Encoding", "gzip,deflate");
        req.Headers.Add("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
        req.Headers.Add("Keep-Alive", "115");
        req.Headers.Add("Cache-Control: max-age=0");
        req.AllowAutoRedirect = true;

        req.IfModifiedSince = DateTime.Now;

        using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
        {
           using (Stream resStream = resp.GetResponseStream())
           {
              StreamReader reader = new StreamReader(resStream);
              return reader.ReadToEnd();
            }
        }
    }

Некоторые страницы работают (W3C, example.com), а большинство других, которые я пробовал, - нет (BBC.co.uk, CNN.com и т. Д.). Wireshark показывает, что я получаю правильный ответ.

Я пытался установить кодировку считывателя в ожидаемую кодировку ответа (CNN - utf8), а также в каждую возможную комбинацию, но мне не повезло.

Что мне здесь не хватает?

Первые байты моего ответа всегда "1f ef bf bd", если вы можете сказать что-то на основании этого.

Ответы [ 2 ]

1 голос
/ 20 ноября 2010

Загрузка http://bbc.co.uk работала для меня, когда я пропускал заголовок "Accept-Encoding":

req.Headers.Add("Accept-Encoding", "gzip,deflate"); 
1 голос
/ 20 ноября 2010

Я подозреваю, что наиболее вероятным объяснением является то, что вы получаете сжатые данные, а не распаковываете их.Попробуйте использовать потоковый фильтр, чтобы удалить / разархивировать его.См. Статью в блоге Рика Штраля для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...