HttpWebResponse Кодировка содержимого: личность - PullRequest
1 голос
/ 21 февраля 2012

Я отправляю и получаю веб-запросы с помощью HttpWebRequest.

После ответа обычно используется gzip-кодировка контента. Некоторые компьютеры получат кодировку дефлята. Некоторые другие компьютеры получат кодировку личности.

У меня настроено чтение gzip и deflate кодировки, но я не уверен, как читать identity encoding.

string ReturnString = "";

HttpWebRequest HttpWebRequest = (HttpWebRequest)WebRequest.Create(URL);
HttpWebRequest.ProtocolVersion = Version.Parse("1.1");
WebHeaderCollection WebHeaderCollection = HttpWebRequest.Headers;
HttpWebRequest.Accept = "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
WebHeaderCollection.Add("Accept-Language: en-us");
WebHeaderCollection.Add("Accept-Encoding: gzip, deflate");
HttpWebRequest.KeepAlive = true;
HttpWebResponse HttpWebResponse = (HttpWebResponse)HttpWebRequest.GetResponse();
using (var mem = HttpWebResponse.GetResponseStream())
{
    if (HttpWebResponse.ContentEncoding.ToLower().Contains("gzip"))
    {
        using (var gzip = new GZipStream(mem, CompressionMode.Decompress))
        {
            using (var reader = new StreamReader(gzip))
            {
                ReturnString = reader.ReadToEnd();
            }
        }
    }
    else if (HttpWebResponse.ContentEncoding.ToLower().Contains("deflate"))
    {
        using (var gzip = new DeflateStream(mem, CompressionMode.Decompress))
        {
            using (var reader = new StreamReader(gzip))
            {
                ReturnString = reader.ReadToEnd();
            }
        }
    }
}
WebHeaderCollection ResponseHeaders = HttpWebResponse.Headers;
HttpWebResponse.Close();

Edit: Другой компьютер получил «Transfer-Encoding: chunked» и не содержал Content Encoding, который, если я правильно понял, должен заменить Content Encoding. http://en.wikipedia.org/wiki/Chunked_transfer_encoding.

Нет ли способа перехватить какой-либо тип кодировки?

1 Ответ

5 голосов
/ 21 февраля 2012

RFC

идентичность

Кодировка по умолчанию (идентификационная); использование без преобразования что бы то ни было. Это кодирование содержимого используется только в Кодировка заголовка, и НЕ ДОЛЖНА использоваться в Content-Encoding заголовок.

Что касается вашего редактирования: вам не нужно заботиться о фрагментации ответа: использование string resp = new StreamReader(response.GetResponseStream()).ReadToEnd() должно дать вам все данные ответа.

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