Кодирование содержимого HttpWebResponse: идентификатор

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

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

Я настроил его для чтения кодировок gzip и deflate, но не знаю, как читать кодировку identity.

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

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

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


person Untouchable    schedule 21.02.2012    source источник


Ответы (1)


RFC:

личность

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

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

person CodeCaster    schedule 21.02.2012
comment
У меня нет доступа к серверу, с которого я получаю эти запросы. Вы говорите, что необходимо внести изменения на стороне сервера? Или что-то вроде этого: WebHeaderCollection.Add(Accept-Encoding: gzip, deflate, identity); - person Untouchable; 21.02.2012
comment
@Untouchable, насколько я понимаю ваш вопрос: если вы получаете тело ответа с примененной кодировкой удостоверения, то никакой другой кодировки не применяется, и вы можете безопасно использовать кодировку по умолчанию. - person CodeCaster; 21.02.2012
comment
Вот более явная ссылка RFC, указывающая на другой раздел того же документа, уточняющая, что кодирование содержимого НЕ ДОЛЖНО иметь значение поля идентификатора; Это был всего лишь щелчок от ссылки в ответе, но программисты ленивы, так что вот: tools.ietf.org/html/rfc2616#section-3.5 - person dot slash hack; 13.08.2014