Как включить сжатие gzip при использовании MVC3 в IIS7?

Кто-нибудь знает, как включить сжатие gzip в MVC 3? Я использую IIS7.

Результат аудита Google Chrome:

  • Включить сжатие gzip (4)
  • Сжатие следующих ресурсов с помощью gzip может уменьшить их размер передачи примерно на две трети (~ 92,23 КБ):
  • /mydomain/может сэкономить ~ 1.53 КБ
  • jquery-1.4.4.min.js может сэкономить ~ 51.35KB
  • Cufon.js может сэкономить ~ 11.89KB
  • Futura.js может сэкономить ~ 27.46KB

Ответ 1

Вы можете настроить сжатие в файле web.config следующим образом:

<system.webServer>
    <urlCompression doStaticCompression="true" doDynamicCompression="true" />
</system.webServer>

Вы можете найти документацию этого элемента конфигурации в iis.net/ConfigReference. Это эквивалентно:

  • Открытие информационных служб Интернета (диспетчер IIS)
  • Перемещение по древовидной структуре слева, пока вы не достигнете виртуального каталога, который вы хотите изменить.
  • Выбор соответствующего виртуального каталога, чтобы заголовок правой панели стал именем указанного виртуального каталога.
  • Выбор "Сжатие" в разделе "IIS" в правой панели
  • Выбор обоих вариантов и выбор "Применить" в разделе "Действия" в крайнем правом углу.

Примечание. (Как указано в комментариях) Вам необходимо убедиться, что Http Dynamic Compression установлено, иначе установка doDynamicCompression="true" не будет иметь никакого эффекта. Самый быстрый способ сделать это:

  • Пуск > Тип optionalfeatures (это самый быстрый способ войти в окно "Включить или отключить Windows" )
  • Перейдите в Internet Information Services > World Wide Web Services > Функции производительности в дереве "Свойства Windows"
  • Убедитесь, что отмечено "Динамическое сжатие содержимого"
  • Нажмите "ОК" и подождите, пока Windows установит компонент

Ответ 2

Вы можете сделать это в коде, если хотите это сделать. Я бы сделал базовый контроллер, который каждый элемент управления наследует и украшает его этим атрибутом ниже.

public class CompressAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {

        var encodingsAccepted = filterContext.HttpContext.Request.Headers["Accept-Encoding"];
        if (string.IsNullOrEmpty(encodingsAccepted)) return;

        encodingsAccepted = encodingsAccepted.ToLowerInvariant();
        var response = filterContext.HttpContext.Response;

        if (encodingsAccepted.Contains("deflate"))
        {
            response.AppendHeader("Content-encoding", "deflate");
            response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
        }
        else if (encodingsAccepted.Contains("gzip"))
        {
            response.AppendHeader("Content-encoding", "gzip");
            response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
        }
    }
}

Ответ 3

Сжатие включено/отключено на уровне сервера. См. Модуль сжатия IIS в консоли управления iis.

Вот инструкции для IIS с сайта microsoft.