ошибка сжатия (заголовка) в .NET HttpWebRequest? - PullRequest
8 голосов
/ 23 ноября 2010

Я только что заметил, что, используя .NET HttpWebRequest, я не получал содержимое gzip с сервера (с 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 вместо анализа заголовков ответа).

Есть предложения?

EDIT:

Следует отметить, что здесь задействована аутентификация; Я только что узнал, что HttpWebRequest изначально выполняет запрос без , включая предоставленные учетные данные. Для этого запроса заголовок Accept-Encoding указан правильно. Дублирование происходит после получения ответа сервера 401 и повторного выполнения запроса с учетными данными.

РЕДАКТИРОВАТЬ 2:

Я опубликовал сообщение об ошибке Microsoft Connect .

Ответы [ 2 ]

4 голосов
/ 23 ноября 2010

Кажется, это ошибка в порядке. Возможные обходные пути:

  1. Не используйте AutomaticDecompression, установите поле заголовка «Accept-Encoding» вручную и вручную обрабатывайте декомпрессию потока ответов, если установлено свойство «Content-Encoding».
  2. Не используйте свойство Credentials, вместо этого вручную создайте заголовок HTTP-авторизации. Это избавляет от ненужного обхода сервера и исправляет ошибку дублирования поля заголовка.
0 голосов
/ 23 ноября 2010

LOL, забавно, что вы упомянули об этом, я заметил это только в пятницу; P

Я не видел никаких проблем из-за этого, мой ответ все еще сжат.

Я также отметил несколько запросов прокси.Но я не могу на всю жизнь получить сжатие GZip, работающее над MS ISA, или новое с сервером длинных имен.Кажется, он просто удаляет заголовок запроса, а сервер даже не знает об этом.Завтра у меня встреча с одним из наших сетевых администраторов, чтобы выяснить, связана ли проблема с прокси-сервером.

Обновление:

Должен отметить, что у меня нет проблемразмещение прокси-сервера Squid между мной и сервером, но это было просто использование обычной аутентификации, а не причудливого запроса-ответа, который использует Windows / ISA.

Обновление 2:

Я забыл упомянуть, заголовок Accept-Encoding тоже «исчезает» при использовании браузера для доступа к сайту.Вот почему я думаю, что настоящая проблема может быть не только для .NET.Тестирование продолжается.

Обновление 3:

Я сделал захват с использованием FF3.6, проходящего через прокси-сервер ISA, и в значительной степени тот же результат.Проходя через ISA, только «одиночный» прокси-сервер аутентифицируется, но окончательный ответ по-прежнему не сжимается.

Учитывая высокий уровень наследственных ошибок в продуктах MS, мне пришлось бы принять сторону ISA / FTMG, являющуюсявиновник здесь.

Обновление 4 (решено):

Только что провел совещание и решил проблему (опубликую screenie с соответствующими настройками позже).Так что догадка была правильной (в моем случае, по крайней мере).

Я бы настоятельно рекомендовал изучить конфигурацию ISA / FTMG, если она используется в сети, в которой размещен сервер.

Обновление 5 (действительно, решено):

Пробовал другую настройку, и это помогло.На прокси-сервере FTMG нам пришлось включить HTTP-сжатие для «внешней» сети, а также убедиться, что сжимаемые типы контента были правильными (пришлось добавить application / soap + xml для WCF).Это позволяет прокси-серверу выполнять сжатие, а реальный веб-сервер - нет, что может быть или не быть идеальным, но по крайней мере это работает.:)

Я бы настоятельно рекомендовал изучить конфигурацию ISA / FTMG, если она используется в сети, в которой находится сервер.

Журнал захвата:

Вот мой след попадания на сайт с IE8 через прокси Forefront TMG, захваченный с помощью Wireshark.Если ошибка специфична для .NET, я ожидаю, что результат будет другим, но из того, что я вижу, он ведет себя так же.

Исходный запрос:

GET http://www.foo.com/ClientInstall HTTP/1.1
Accept: image/gif, image/jpeg, ...
Accept-Language: en-us
User-Agent: Mozilla/4.0 (compatible; ...
Accept-Encoding: gzip, deflate
Proxy-Connection: Keep-Alive
Host: www.foo.com

HTTP/1.1 407 Proxy Authentication Required 
  ( Forefront TMG requires authorization to fulfill the request. 
  Access to the Web Proxy filter is denied.  )
Via: 1.1 PROXP01
Proxy-Authenticate: Negotiate
Proxy-Authenticate: Kerberos
Proxy-Authenticate: NTLM
Proxy-Authenticate: Basic realm="PROXP01.bar.com"
Connection: Keep-Alive
Proxy-Connection: Keep-Alive
Pragma: no-cache
Cache-Control: no-cache
Content-Type: text/html
Content-Length: 4140  

Аутентификация с прокси, но не получается?:

GET http://www.foo.com/ClientInstall HTTP/1.1
Accept: image/gif, image/jpeg, ...
Accept-Language: en-us
User-Agent: Mozilla/4.0 (compatible; ...
Accept-Encoding: gzip, deflate
Proxy-Connection: Keep-Alive
Host: www.foo.com
Proxy-Authorization: Negotiate TlRMTVNTUAABAAAA...

HTTP/1.1 407 Proxy Authentication Required ( Access is denied.  )
Via: 1.1 PROXP01
Proxy-Authenticate: Negotiate TlRMTVNTUAACAAAAB...
Connection: Keep-Alive
Proxy-Connection: Keep-Alive
Pragma: no-cache
Cache-Control: no-cache
Content-Type: text/html
Content-Length: 0     

Конечная последовательность:

GET http://www.foo.com/ClientInstall HTTP/1.1
Accept: image/gif, image/jpeg, ...
Accept-Language: en-us
User-Agent: Mozilla/4.0 (compatible; ...
Accept-Encoding: gzip, deflate
Proxy-Connection: Keep-Alive
Proxy-Authorization: Negotiate TlRMTVNTUAADAAAAGAAYAH4AAAA...
Host: www.foo.com

HTTP/1.1 301 OK
Via: 1.1 PROXP01
Connection: Keep-Alive
Proxy-Connection: Keep-Alive
Content-Length: 160
Date: Wed, 24 Nov 2010 04:34:31 GMT
Age: 308
Location: http://www.foo.com/ClientInstall/
Content-Type: text/html; charset=UTF-8
Server: Microsoft-IIS/7.0
X-Powered-By: ASP.NET

GET http://www.foo.com/ClientInstall/ HTTP/1.1
Accept: image/gif, image/jpeg, ...
Accept-Language: en-us
User-Agent: Mozilla/4.0 (compatible; ...
Accept-Encoding: gzip, deflate
Proxy-Connection: Keep-Alive
Host: www.foo.com

HTTP/1.1 200 OK
Via: 1.1 PROXP01
Connection: Keep-Alive
Proxy-Connection: Keep-Alive
Content-Length: 4621
Date: Wed, 24 Nov 2010 04:39:39 GMT
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/7.0
Cache-Control: private
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...