Я только что заметил, что при использовании .NET HttpWebRequest
я не получал gzip ' d обратно с сервера (запущен nginx 0.8.52). Тестируя с помощью curl, я убедился, что gzip настроен правильно на стороне сервера, а затем попытался разобраться в проблеме с отладчиком VS.
Оказывается, виноват то, как создается поле заголовка Accept-Encoding
: если я устанавливаю
request.AutomaticDecompression = DecompressionMethods.GZip |
DecompressionMethods.Deflate`
, я получаю следующий заголовок:
`Accept-Encoding: gzip, deflate,gzip, deflate`.
Если я устанавливаю
request.AutomaticDecompression = DecompressionMethods.GZip;
, я получаю
Accept-Encoding: gzip,gzip
Я не проверял, что говорит спецификация HTTP, но nginx должен обработать ситуацию, но вместо этого он возвращает Vary: Accept-Encoding
назад. С другой стороны, заголовок Accept-Encoding
, сгенерированный HttpWebRequest
, определенно не выглядит правильным и кажется мне ошибкой.
Если я не укажу AutomaticDecompression
и вручную задаю заголовок Accept-Encoding
, я получу gzip ' d, но HttpWebRequest
кажется довольно глупым и не декодирует сжатый поток (я полагаю, он полагается на внутренний флаг IsCompressed
, а не на синтаксический анализ заголовков ответов).
Есть предложения?
Следует отметить, что здесь задействована аутентификация; Я только что узнал, что HttpWebRequest
изначально выполняет запрос без , включая предоставленные учетные данные. Для этого запроса заголовок Accept-Encoding
указан правильно. Дублирование происходит после получения ответа сервера 401 и повторного выполнения запроса с учетными данными.