При использовании http-кодирования хороший способ включить сжатие ответов (только) заключается в использовании dynamic compression built-in to IIS7 and higher.
но я не понимаю, как клиент знает, чтобы сжать запросы и разложить ответ?
Далее следует описание того, что HTTP предлагает из коробки, которая может использоваться вместе с кодировками HTTP (S) WCF. В дополнение к этому WCF 4.5 предоставляет gzip and deflatecompression of its binary encoding.
Сжатые ответы являются частью стандарта HTTP. В своем запросе клиент сигналы на сервер, какие методы сжатия (GZIP, выкачать, ...) он поддерживает с помощью следующего заголовка:
Accept-Encoding: gzip, deflate
Сервера, по своему собственному усмотрению, бесконечной мудрости и таинственному пути, может игнорировать этот заголовок и отправить ответ без сжатия, или он может выбрать любой из предложенных клиентом алгоритмов, отвечая, скажем, со следующим заголовком и сжимать тело ответа.
Content-Encoding: gzip
Чтобы сделать дела более сложным, сервер, вероятно, также установлен следующий заголовок:
Transfer-Encoding: chunked
Это позволяет серверу опустить в противном случае обязательный Content-Length
заголовок, как HTTP заголовки в общем, имеет чтобы предшествовать телу HTTP. (Установка кодировки chunked
affects the way the body gets encoded.) Таким образом, теперь он может сжимать тело ответа «на лету», т. Е. Выплескивать байты по мере их сжатия, не дожидаясь завершения сжатия всего тела, чтобы иметь возможность определить длину содержимого сжатого результата. Это может сэкономить много памяти на стороне сервера. (Клиентская сторона, однако, теперь осталось в темноте, чтобы общего размер сжатого ответа, пока он не завершил прием полного ответа, что делает его декомпрессия несколько менее эффективна)
Обратите внимание, однако, что использование Accept-Encoding
и Content-Encoding
, как я только что описал, чтобы сжимать ответы на самом деле a stupid idea, по HTTP соавтора Рой Филдинг и что должно было быть использовано вместо этого следующий заголовок в запросе:
TE: gzip, deflate
и серв э, если он хочет выполнить сжатие, добавить следующий заголовок к своему ответу:
Transfer-Encoding: gzip, chunked
Как и прежде, chunked
необходимо, если сервер хочет опустить Content-Length
.
В противном случае, комбо TE
/Transfer-Encoding
синтаксически идентичен комбо Accept-Encoding
/Content-Encoding
, но смысл отличается, как можно почерпнуть из this longish discussion.
Суть проблемы: ТОТ/Transfer-Encoding делает сжатие в транспортной детали, тогда как Accept-Encoding/Content-Encoding обозначает сжатую версию как фактические данные (сущности в HTTP языке), с число неудачных последствий, связанных с кэшированием запросов, проксиминга и т. д. последних.
Однако корабль TE/Transfer-Encoding давно отплыл, и мы придерживаемся комбо AE/CE, который поддерживается большинством клиентов и серверов со значением, которое на самом деле ближе к значению TE/TE
Когда дело доходит до сжатых запросов в HTTP, они редко используются на практике, а не стандартный способ для клиента, чтобы выяснить, если сервер поддерживает его. Либо вы сообщаете клиенту внеполосное (например, жесткое кодирование), что сервер понимает сжатые запросы (и configure the server appropriately). Или у вас есть клиент, проактивно пытающийся выполнить сжатие один раз, и если он дает 400 Bad Request
(по крайней мере, это то, что вернет IIS 7.5), вы возвращаетесь к несжатым запросам.