2012-05-15 3 views
1

Я прочитал это WCF Compression статья Я понимаю, что для. NET 4.0 WCF-сжатие доступно из коробки.WCF Сжатие с .net 4

Я не могу найти четкое объяснение того, как его использовать, нужно ли определять какие-либо настройки или изменять привязку? или он автоматически сжимается?

Я использую basicHttpBinding в IIS7. Опция «enable dynamic compression» установлена ​​в true, но я не понимаю, как клиент знает, как сжимать запросы и декомпрессировать ответ?

Любое объяснение, включая установку привязки для уменьшения размера сообщения, будет оценено по достоинству. Я испытываю очень плохую производительность при работе на удаленном сервере с пропускной способностью 4 МБ.

ответ

2

но я не понимаю, как клиент знает, как сжимать запросы и декомпрессировать ответ?

Все это часть спецификации HTTP. Поскольку WCF использует HTTP & IIS, он может использовать встроенное сжатие веб-сервера и HTTP-стека клиента.

Заканчивать раздел 14.3: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

В принципе, клиент должен послать заголовок о том, что поддерживает сжатие. Пример: Accept-Encoding: gzip, deflate. Вы можете установить это, выполнив инструкции в своей статье для раздела WCF Client. Затем ваш клиент отправит правильные заголовки на сервер.

Теперь на стороне сервера IIS увидит этот заголовок, и он сжимает ответ ... , если он настроен для этого. Связанная статья рассказывает вам, как настроить IIS для сжатия для служб WCF. Затем сервер отправит обратно клиенту сообщение, сообщающее, что содержимое сжато: Content-Encoding: gzip. Затем клиент будет декомпрессировать ответ и продолжить свой весёлый путь.

Это в значительной степени; это просто вопрос правильности заголовков клиентов, а сервер настроен на отправку сжатого ответа. В статье рассказывается, как это сделать. Надежда, что помогает

1

Образец сжатия обеспечивается в .NET 4 WCF образца,

http://www.microsoft.com/en-us/download/details.aspx?id=21459

Этот блог объясняет это с большим количеством информации,

http://blogs.msdn.com/b/dmetzgar/archive/2011/03/10/compressing-messages-in-wcf-part-one-fixing-the-gzipmessageencoder-bug.aspx

Есть другие должности на блогах MSDN, таких как

http://blogs.msdn.com/b/dmetzgar/archive/2011/04/29/automatic-decompression-in-wcf.aspx

0

При использовании 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. (Установка кодировки chunkedaffects 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), вы возвращаетесь к несжатым запросам.

2

Обратите внимание, что сжатие было добавлено в WCF 4.5. Она покрыта здесь: http://msdn.microsoft.com/en-us/library/aa751889(v=vs.110).aspx

Вы должны использовать пользовательские привязки, чтобы включить его:

<customBinding> 
    <binding name="BinaryCompressionBinding"> 
    <binaryMessageEncoding compressionFormat="GZip"/> 
    <httpTransport /> 
    </binding> 
</customBinding> 

Он работает только с двоичным кодированием. Кроме того, вы должны знать о своем сценарии. Если вы размещены в IIS, сжатие может быть включено. См. Здесь: http://blogs.msdn.com/b/dmetzgar/archive/2011/04/29/automatic-decompression-in-wcf.aspx

Смежные вопросы