Как включить сжатие IIS для служб WCF? - PullRequest
9 голосов
/ 14 ноября 2009

В настоящее время я использую пользовательский кодировщик 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.

Итак, я

  • Добавил его вручную ко всем исходящим вызовам, используя класс 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

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

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


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

Ответы [ 4 ]

9 голосов
/ 28 июля 2011

У меня была такая же проблема; Страницы .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
  • Откройте% SystemRoot% \ system32 \ inetsrv \ config \ applicationhost.config и добавьте соответствующий тип контента в раздел
  • После этого он все еще не работал.
  • Я проверил данные с помощью Tamper Data в Firefox и заметил, что возвращаемый тип контента на самом деле был «application / xml; charset = utf-8».
  • После добавления в раздел типа содержимого complete , включая «; charset = utf-8», получилось:
<add mimeType="application/xml; charset=utf-8" enabled="true" />

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

1 голос
/ 14 сентября 2012

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

Эта статья показывает вам оба пути:

http://www.hanselman.com/blog/EnablingDynamicCompressionGzipDeflateForWCFDataFeedsODataAndOtherCustomServicesInIIS7.aspx

Я нашел способ GUI простым. В статье показано, как подтвердить, что он работает с Fiddler.

Ура!

1 голос
/ 30 декабря 2009

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

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

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

1 голос
/ 19 ноября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...