#c# #.net #http #compression #cross-browser
#c# #.net #http #сжатие #кроссбраузерность
Вопрос:
Я рассматриваю этот метод в этом HTTPCombiner:
private bool CanGZip(HttpRequest request)
{
string acceptEncoding = request.Headers["Accept-Encoding"];
if (!string.IsNullOrEmpty(acceptEncoding) amp;amp;
(acceptEncoding.Contains("gzip") || acceptEncoding.Contains("deflate")))
return true;
return false;
}
Если это возвращает true, то ответ сжимается с помощью GZipStream
. Правильно ли это?
Ответ №1:
Это два разных алгоритма :
- http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3
- http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.5
Некоторый код здесь :
Итак, согласно протоколу, это неправильно, поскольку, если браузер говорит «предоставьте мне содержимое с помощью deflate», вы не должны отправлять его обратно в архивированном виде.
Ответ №2:
GZip (который основан на Deflate) и Deflate — это два разных алгоритма, поэтому запрос «deflate» определенно не должен возвращать загруженное содержимое.
Однако это должно быть легко исправить, просто используя GZipStream
заголовок accept содержит «gzip» и DeflateStream
для «deflate».
Оба включены в System.IO.Compression
, так что вам не придется кодировать свой собственный алгоритм deflate или использовать стороннюю реализацию.
Ответ №3:
Обычно большинство браузеров понимают GZip и Deflate. Они сообщают серверу, указывая это в заголовке запроса как Accept-Encoding:gzip, deflate
. HTTPCombiner отдает предпочтение GZip. Если присутствуют оба типа, то предпочтение отдается GZip. HttpCombiner отправит содержимое, только если браузер запрашивает только Defalte.