2009-03-24 1 views
42

Я пытаюсь сделать запрос, который принимает сжатый ответHttpWebResponse .NET автоматически распаковывает GZiped и Deflated ответы?

var request = (HttpWebRequest)HttpWebRequest.Create(requestUri); 
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate"); 

Интересно, когда я добавляю вторую линию, мне придется обрабатывать декомпрессию вручную.

+0

я думаю Рик Стрэхл должно быть неправильным. Вы сами пробовали? – Keltex

+0

спасибо - просто пытаясь понять вещи, можете ли вы сказать мне, если это правильно? (a) Если вы НЕ добавляете эту строку «AcceptEncoding», то - при загрузке несжатого файла => работает FINE - если вы загрузите сжатый файл => ISSUE (загрузите файл, но будете выглядеть коррумпированными, так как не был несжатым) (b) если вы добавили эту строку «AcceptEncoding», то: - если вы загружаете несжатый файл => все еще работает FINE - если вы загружаете сжатый файл => отлично работает (будет несжатый) Правильно ли это? – Greg

+1

@Greg Ни один из вариантов. Вторая строка заключается не в загрузке файлов, которые, возможно, уже сжаты (т. Е. Zip-файлы), а в загрузке веб-ресурсов, которые могут быть сжаты по требованию (т. Е. Html-файлы). Если вы не поместите вторую строку, хорошо выполненный веб-сервер не отправит вам сжатые файлы вообще. Если веб-сервер имеет возможность сжимать файлы, он будет работать, только если вы поместите вторую строку. –

ответ

102

Я нашел ответ.

Вы можете изменить код:

var request = (HttpWebRequest)HttpWebRequest.Create(requestUri); 
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 

И вы будете иметь автоматическую декомпрессию. Не нужно менять остальную часть кода.

+2

хороший ответ, мне очень помог :) –

+5

Технически вам нужна только одна строка, «Автоматическое декомпрессия». Кажется, что автоматически добавляет «gzip, deflate» в заголовки. – LongZheng

+0

Совершенно сработало! Большое спасибо! –

-3

Я думаю, вам нужно самостоятельно распаковать поток. Вот статья о том, как это сделать:

http://www.west-wind.com/WebLog/posts/102969.aspx

+0

см. Мой ответ ниже –

+0

Хорошая находка. Похоже, это было добавлено в .NET 2.0. Может быть, Strahl, когда написал свою статью, он был использован для 1.1. – Keltex

+0

Использование HttpWebRequest.AutomaticDecompression автоматически добавляет правильные заголовки запросов и обрабатывает декомпрессию. – Armbrat

-2

GZIP и выкачать ответы автоматически не обрабатываются. См. Эту статью: HttpWebRequest and GZip Http Responses

+0

Это неправда. – Armbrat

+0

Извините, я смешал это с классами запросов и ответов HttpListener. Стандартный веб-запрос в .Net действительно обрабатывает сжатые ответы. –

0

Для .NET Core вещи немного больше связаны. GZipStream нужен, поскольку есть не свойство (как в письменной форме) для AutomaticCompression Рассмотрим следующий пример: GET

var req = WebRequest.CreateHttp(uri); 

/* 
* Headers 
*/ 
req.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate"; 

/* 
* Execute 
*/ 
try 
{ 
    using (var resp = await req.GetResponseAsync()) 
    { 
     using (var str = resp.GetResponseStream()) 
     using (var gsr = new GZipStream(str, CompressionMode.Decompress)) 
     using (var sr = new StreamReader(gsr)) 

     { 
      string s = await sr.ReadToEndAsync(); 
     } 
    } 
} 
catch (WebException ex) 
{ 
    using (HttpWebResponse response = (HttpWebResponse)ex.Response) 
    { 
     using (StreamReader sr = new StreamReader(response.GetResponseStream())) 
     { 
      string respStr = sr.ReadToEnd(); 
      int statusCode = (int)response.StatusCode; 

      string errorMsh = $"Request ({url}) failed ({statusCode}) on, with error: {respStr}"; 
     } 
    } 
} 
Смежные вопросы