Настройка сжатия gzip для WCF в IIS6 и IIS7

В нашем рабочем проекте мы используем связку APS.Net — RIA Services — Silverlight. Объем передаваемых данных от сервера к клиенту бывает достаточно большим, несколько мегабайт.

Неплохо было бы использовать компрессию gzip, как для статического содержимого типа html-страниц, css и javascript файлов, так и для динамических данных, в том числе от WCF сервиса (ибо в основе RIA Services лежит WCF).

На рабочем сервере системы используется IIS7, а на тестовом — IIS6. Озадачившись вопросом компрессии я использовал руководство для IIS6 и руководство для IIS7 по настройке сжатия в gzip. В результате система работала на обоих серверах, но данные от веб-сервиса не сжимались, что меня весьма огорчало.

В поисках решения вот тут было найдено предложение насильно жать ответ от веб-сервиса с помощью gzip или deflate компрессии, если по заголовкам запроса видно, что клиент готов принять сжатые данные. После реализации данного метода компрессия заработала в IIS7, однако при работе с системой на сервере с IIS6 стали происходить ужасные вещи: сервер в заголовке указывал один размер сообщения, а по факту отдавал другой (спасибо Fiddler2), большая часть запросов завершалась по тайм ауту. Говоря простыми словами, система не работала.

В конечном счёте решение было найдено, оно связано с более правильной настройкой серверов IIS.

Для IIS6 с помощью инструкции по решению проблем выполняем шаги 1, 2, 3, 4 и на четвертом шаге добавляем расширение «svc» в список компрессируемых файлов (т. к. если посмотреть на запрос к веб-сервису в Fiddler2 можно увидеть, что генерируемый веб-сервис имеет расширение .svc). Перезапускаем w3svc и радуемся.

Для IIS7 надо указать MIME-типы данных, которые должны сжиматься. Для запросов RIA Services это «application/msbin1». Настроить эти типы данных можно в файле конфигурации IIS7 C:\Windows\System32\inetsrv\config\applicationhost.config в секции httpCompression примерно таким образом:

<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" staticCompressionLevel="9" dynamicCompressionLevel="4" />
    <staticTypes>
        <add mimeType="text/*" enabled="true" />
        <add mimeType="message/*" enabled="true" />
        <add mimeType="application/javascript" enabled="true" />
        <add mimeType="*/*" enabled="false" />
    </staticTypes>
    <dynamicTypes>
        <add mimeType="text/*" enabled="true" />
        <add mimeType="message/*" enabled="true" />
        <add mimeType="application/x-javascript" enabled="true" />
        <add mimeType="application/atom+xml" enabled="true" />
        <add mimeType="application/xaml+xml" enabled="true" />
        <add mimeType="application/xop+xml" enabled="true" />
        <add mimeType="application/soap+xml" enabled="true" />
        <add mimeType="application/msbin1" enabled="true" />
        <add mimeType="*/*" enabled="false" />
    </dynamicTypes>
</httpCompression>

Сжимайте на здоровье!

Sat, 07.05.2011

Теги: IIS6, IIS7, gzip, руководство