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

101

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

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

  1. Включить сжатие gzip (4)
  2. Сжатие следующих ресурсов с помощью gzip может уменьшить их размер передачи примерно на две трети (~ 92,23 КБ):
  3. / mydomain / может сэкономить ~ 1,53 КБ
  4. jquery-1.4.4.min.js может сэкономить ~ 51,35 КБ
  5. Cufon.js может сэкономить ~ 11,89 КБ.
  6. Futura.js может сэкономить ~ 27,46 КБ.
imarkic84
источник
Не молчите дубликат: stackoverflow.com/q/552317/712526
jpaugh

Ответы:

143

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

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

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

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

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

  1. Пуск> Тип optionalfeatures(это самый быстрый способ перейти к окну «Включение или отключение компонентов Windows»)
  2. Перейдите к Internet Information Services> World Wide Web Services> Performance Features в древовидной структуре «Windows Features».
  3. Убедитесь, что установлен флажок «Сжатие динамического содержимого».
  4. Нажмите «ОК» и подождите, пока Windows установит компонент.
Роб
источник
11
Стоит отметить, что вам необходимо установить параметр Http Compression Dynamic IIS, чтобы это работало. Ссылка на конфигурацию в этом ответе содержит подробную информацию.
Калеб Вир
16
На Windows Server 2008 optionalfeaturesу меня не работало. Вместо этого перейдите в Диспетчер серверов> Роли> Прокрутите до веб-сервера (IIS)> щелкните Добавить службы ролей. Теперь убедитесь, что установлены Веб-сервер> Производительность> Сжатие статического содержимого и Сжатие динамического содержимого.
Рори
1
Имейте в виду, что это может испортить ваш заголовок хоста "Vary:". Дополнительная информация: stackoverflow.com/questions/5372052/…
jjxtra
2
По крайней мере, по моему опыту, это сжимает все, НО вывод контроллеров MVC. Они почему-то возвращают HTML без сжатия gzip.
Крис Москини
1
Осторожно !!! IIS Dynamic Compression удаляет заголовки Vary, это ошибка или функция, я не знаю, но реализация настраиваемого фильтра имеет больше смысла, если вы хотите, чтобы кеш работал правильно.
Акаш Кава
31

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

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);
        }
    }
}
NetProvoke
источник
2
@JustAnotherUserYouMayKnow - зависит от того, как вы обслуживаете свои ресурсы; если вы указываете прямо на файлы на сервере, тогда нет, однако, если вы обслуживаете их с помощью действий (как позволяет нам наша система управления ресурсами), тогда это работает блестяще. Кстати, Рик Страл обновил это, чтобы поддерживать проверку того, что клиент действительно поддерживает gzip, перед сжатием
Пол Кэрролл
4
Обратите внимание, что для перенаправления важно защитить себя от filterнулевого значения. Я использовал var response = ...;if( response == null || response.Filter == null)return;.
Travis J
2
Кроме того, вы можете использовать gzipfirst вместо deflate, подробнее здесь: stackoverflow.com/a/9856879/1026459
Travis J
IIS кэширует сжатые файлы, поэтому для повышения производительности не потребуется их повторно сжимать. Используйте IIS, если можете, и используйте этот подход только в том случае, если сжатие IIS вам недоступно.
Мухаммад Рехан Саид
1
Ни одно из этих решений не работает на MVC5, IIS 8.5, .Net 4.5 Localhost. Что мне делать, есть предложения?
aadi1295
12

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

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

нахли
источник
1
Вы также можете установить его в web.config
Джек Маркетти,