Как включить сжатие IIS для служб WCF?

В настоящее время я использую собственный кодировщик gzip для своей службы WCF. Я хочу заменить его встроенным сжатием IIS 7, если это возможно. Я не могу найти в Интернете информацию о том, как это сделать.

Есть ли способ включить сжатие IIS 7 для служб WCF? Вы знаете, будет ли это поддерживаться "из коробки" в .Net 4?

Редактировать 15 июня: я все еще ищу способ заменить наш пользовательский кодировщик gzip обычным подходом, поэтому, если вы знаете, как это сделать с .Net 4 и IIS 7, ответьте этот вопрос.

Спасибо


Боковая панель: Моя попытка сделать это вручную

Поскольку я не могу найти, как это сделать, просто повернув несколько ручек, я решил попробовать включить его вручную.

Пока у меня есть:

  • Установлен и включен модуль динамического сжатия IIS 7.
  • Изменен раздел файла applicationHost.config, чтобы включить сжатие для mimeType="application/soap+xml" и mimeType="application/xop+xml".

Я использовал сниффер HTTP для прослушивания трафика, отправляемого из моего приложения (Windows Forms). Я вижу, что у запросов нет Accept-Encoding:gzip,deflate http-заголовка.

So I

  • Добавил вручную ко всем исходящим звонкам с использованием класса OperationContextScope и его OutgoingMessageProperties. (Подробности опубликую позже, если найду решение).

С помощью HTTP-сниффера я вижу, что заголовок клиента теперь имеет правильный заголовок:

POST /### path to my service ####/MyService.svc HTTP/1.1
MIME-Version: 1.0
Content-Type: multipart/related; type="application/xop+xml";
    start="<http://tempuri.org/0>";
    boundary="uuid:####### some uuid #############";
    start-info="application/soap+xml"
Accept-Encoding: gzip,deflate
Host: ####### my server name #############
Content-Length: 1753
Expect: 100-continue

Но ответ сервера все еще не сжат.

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


Спасибо за вашу помощь


person Sylvain    schedule 14.11.2009    source источник
comment
Мой вопрос кажется дубликатом http://stackoverflow.com/questions/1741768/wcf-gzip-compression-request-response-processing. Этот вопрос относится к IIS 6, но я думаю, что решение будет работать и здесь. Если это так, я закрою этот вопрос как дубликат.   -  person Sylvain    schedule 19.11.2009


Ответы (4)


У меня такая же проблема; Страницы .aspx были сжаты, а содержимое WCF - нет. Это связано с типом контента, возвращаемым службой WCF, который был добавлен к типу mime.

Я заставил его работать со следующим разделом в ApplicationHost.config:

<dynamicTypes>
    <add mimeType="text/*" enabled="true" />
    <add mimeType="message/*" enabled="true" />
    <add mimeType="application/*" enabled="true" />
    <add mimeType="*/*" enabled="false" />
</dynamicTypes>

Вот что я сделал (большинство шагов, которые уже упоминались):

  • Установите службу роли динамического сжатия для роли IIS
  • Включите сжатие динамического содержимого для веб-сайта, который вы используете для размещения службы WCF
  • Open %SystemRoot%\system32\inetsrv\config\applicationhost.config and add the relevant content type to the section of the
  • After this it still didn't work.
  • Я проверил данные с помощью Firefox Tamper Data и заметил, что возвращаемый тип контента на самом деле был «application / xml; charset = utf-8».
  • После добавления в раздел полного типа контента, включая "; charset = utf-8", все заработало:
<add mimeType="application/xml; charset=utf-8" enabled="true" />

Поскольку я чувствовал, что кодировка набора символов не должна определять, работает сжатие или нет, я позволил IIS сжимать все типы содержимого application / *.

person Arjan van der Meer    schedule 28.07.2011
comment
Напоминание: сначала сделайте резервную копию. Файл c:\windows\system32\inetsrv\config\applicationHost.config - person Simon_Weaver; 13.10.2017

Возможно, это зависит от конкретной настройки службы WCF, которую вы используете, но для приложений, в которых я ее использовал (все имели смешанный доступ как для приложений .NET, так и для страниц Silverlight), сгенерированный клиентский класс WCF содержал свойство EnableDecompression, которое можно установить к истине. После этого мои приложения Winforms отправляют правильные заголовки, и связь веб-службы правильно сжимается.

person David Hay    schedule 19.11.2009
comment
Спасибо за Ваш ответ. Мое клиентское приложение - это базовое приложение WinForms, поэтому я могу использовать EnableDecompression. Ваш ответ подразумевает, что вы успешно включили сжатие на сервере. Это было на IIS 7? Как вы его настраивали? Есть идеи, почему я не могу заставить сервер возвращать сжатые ответы? - person Sylvain; 19.11.2009

Кажется, вы можете включить динамическое сжатие в IIS через графический интерфейс или интерфейс командной строки.

В этой статье показаны оба пути:

http://www.hanselman.com/blog/EnablesDynamedsCompressionDataGzip

Я нашел графический интерфейс простым. В статье показано, как убедиться, что он работает с Fiddler.

Ваше здоровье!

person Colin    schedule 14.09.2012

Это полезно для IIS 6

http://ramon.bloggingabout.net/2008/11/06/wcf-and-http-gzipdeflate-compression-and-silverlight/

(обновленный URL)

person Simon_Weaver    schedule 30.12.2009
comment
Это мертвый продукт ;-) - person Simon_Weaver; 13.10.2017