Как заставить работать сжатие gzip в WCF 4.5

WCF 4.5 поддерживает GZIP без сторонних библиотек или рукописных расширений. Я заставил его работать через привязку TCP, но не могу найти способ заставить его работать через привязку HTTP. мой wcf - Служба размещается в службе Windows.

Дополнение: мне не разрешено использовать IIS; я не могу переключиться на замену WCF.

это работает с gzip:

binding="customBinding" bindingConfiguration="tcpCompressionBinding" name="tcp" 

и это то, что я сейчас использую для http:

binding="basicHttpBinding" bindingConfiguration="httpBinding" name="http"

Документация мне не особо помогает: http://msdn.microsoft.com/en-us/library/dd456789.aspx.

Но, согласно этому, он должен работать:

Начиная с WCF 4.5 двоичный кодировщик WCF добавляет поддержку сжатия. Тип сжатия настраивается с помощью свойства CompressionFormat. И клиент, и служба должны настроить свойство CompressionFormat. Сжатие будет работать для протоколов HTTP, HTTPS и TCP. Если клиент указывает использовать сжатие, но служба не поддерживает его, генерируется исключение протокола, указывающее на несоответствие протокола. Для получения дополнительной информации см. Выбор кодировщика сообщений.


person NickD    schedule 28.03.2013    source источник
comment
Некоторое время назад у меня была такая же проблема с WCF 4.0.   -  person rekire    schedule 29.03.2013
comment
не думаю. wcf 4.0 не имеет встроенной поддержки gzip. это функция 4.5.   -  person NickD    schedule 29.03.2013
comment
Прохладный. Я этого не знал.   -  person rekire    schedule 29.03.2013
comment
Я знаю, как написать это сам, как в 4.0, но я хочу встроить его, что наверняка быстрее.   -  person NickD    schedule 29.03.2013
comment
К сожалению, около полугода назад я перестал использовать WCF.   -  person rekire    schedule 29.03.2013
comment
Думаю, вы уже читали это в документации, но на всякий случай пропустили: начиная с WCF 4.5 двоичный кодировщик WCF добавляет поддержку сжатия. Это позволяет использовать алгоритм gzip / deflate для отправки сжатых сообщений от клиента WCF, а также отвечать сжатыми сообщениями из автономной службы WCF. Эта функция включает сжатие для транспорта HTTP и TCP. Службу WCF, размещенную в IIS, всегда можно включить для отправки сжатых ответов, настроив хост-сервер IIS. Тип сжатия настраивается с помощью свойства CompressionFormat.   -  person jpw    schedule 30.03.2013
comment
Поскольку это свойство отображается только в binaryMessageEncodingBindingElement, вам нужно будет создать настраиваемую привязку, подобную следующей, чтобы использовать эту функцию: ‹customBinding› ‹имя привязки = BinaryCompressionBinding› ‹binaryMessageEncoding compressFormat = GZip /› ‹httpTransport /› ‹/binding› ‹/CustomBinding› И клиент, и служба должны согласиться на отправку и получение сжатых сообщений, поэтому свойство compressFormat должно быть настроено в элементе binaryMessageEncoding как на клиенте, так и на службе.   -  person jpw    schedule 30.03.2013
comment
да, прочитал это. похоже, нет привязки httpcompression, и в обычном режиме я не могу найти свойство. tcp со сжатием работает нормально.   -  person NickD    schedule 30.03.2013
comment
Вы проверили сжатие уровня IIS? stackoverflow.com/ questions / 1735088 /   -  person lcryder    schedule 01.04.2013
comment
да, но мое требование - самостоятельный хостинг в службе. iis gzip работает. в любом случае спасибо!   -  person NickD    schedule 01.04.2013
comment
Если вы полностью застряли, у меня есть специальный код, который подключается к инфраструктуре WCF и выполняет за вас архивирование и разархивирование. Я использовал его с WCF 3.5, поэтому не вижу причин, по которым он не работает с 4.5.   -  person Rocklan    schedule 03.04.2013
comment
Спасибо. есть то же самое, что и обходной путь. чувствую себя немного хромым, не могу использовать встроенные средства.   -  person NickD    schedule 03.04.2013
comment
@jpw, пожалуйста, скопируйте свой комментарий в качестве ответа, это кажется правильным ответом, чтобы я мог присуждать награду.   -  person NickD    schedule 07.04.2013


Ответы (1)


По запросу я скопировал свой комментарий в качестве ответа:

"Поскольку это свойство отображается только в binaryMessageEncodingBindingElement, вам нужно будет создать настраиваемую привязку, подобную следующей, чтобы использовать эту функцию:

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

и получать сжатые сообщения, поэтому свойство compressFormat должно быть настроено для элемента binaryMessageEncoding как на клиенте, так и на службе. "И клиент, и служба должны согласиться на отправку

person jpw    schedule 07.04.2013
comment
Старый пост знаю. Но у меня это не работает. Есть идеи, почему? - person Ahmed Khalaf; 17.10.2016
comment
как это сделать в коде? мне нужно создать пользовательскую привязку или создать var binding = new NetTcpBinding(), а затем var elements = binding.CreateBindingElements(), а затем elements.Add(new BinayMessageEncodingBindingElement{CompressionFormat=Gzip})? это изменит привязку или elements потеряны? - person JobaDiniz; 09.04.2020