Як увімкнути компресію gzip при використанні MVC3 на IIS7?


100

Хтось знає, як увімкнути компресію gzip у MVC 3? Я використовую IIS7.

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

  1. Увімкнути стиснення gzip (4)
  2. Стиснення таких ресурсів за допомогою gzip може зменшити розмір їх передачі приблизно на дві третини (~ 92,23 КБ):
  3. / мідомен / міг би заощадити ~ 1,53 Кб
  4. jquery-1.4.4.min.js міг би заощадити ~ 51.35KB
  5. Cufon.js може зекономити ~ 11,89 КБ
  6. Futura.js міг би заощадити ~ 27,46 КБ

Чи не тихий дублікат: stackoverflow.com/q/552317/712526
jpaugh

Відповіді:


143

Ви можете налаштувати стиснення через web.configфайл так:

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

Ви можете знайти документацію цього конфігураційного елемента на iis.net/ConfigReference . Це еквівалент:

  1. Відкриття інформаційних служб Інтернету (IIS Manager)
  2. Переміщення по дереву зліва, поки ви не отримаєте віртуальний каталог, який ви бажаєте змінити
  3. Вибір відповідного віртуального каталогу, щоб заголовок правої панелі став іменем зазначеного віртуального каталогу.
  4. Вибір "Стиснення" під "IIS" на правій панелі
  5. Позначте обидва варіанти та виберіть "Застосувати" в розділі "Дії" в правій крайній частині.

Примітка: (Як зазначено в коментарях) Вам потрібно переконатися, що встановлення Http Dynamic Compression встановлено, інакше налаштування doDynamicCompression="true"не матиме жодного ефекту. Найшвидший спосіб зробити це:

  1. Пуск> Введіть optionalfeatures(це найшвидший спосіб дістатися до вікна "Увімкнення та вимкнення функцій Windows")
  2. Перейдіть до інформаційних служб Інтернету> Служби всесвітньої веб-служби> Особливості продуктивності у перегляді дерева "Особливості Windows"
  3. Переконайтесь, що "Динамічне стиснення вмісту" відмічено
  4. Натисніть "Гаразд" і зачекайте, поки Windows встановить компонент

11
Варто зазначити, що для цього вам потрібно встановити опцію Http Compression Dynamic IIS. Довідкова посилання конфігурації у цій відповіді містить дані.
Caleb Vear

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);
        }
    }
}

2
@JustAgetherUserYouMayKnow - залежить від того, як ви обслуговуєте свої ресурси; якщо ви вказуєте безпосередньо на файли на сервері, то ні, однак якщо ви обслуговуєте їх через дії (як це дозволяє наша система управління ресурсами), то це працює чудово. BTW Рік Страль оновив це, щоб підтвердити, чи дійсно клієнт підтримує gzip перед компресією
Пол Керролл

4
Зауважте, що для переадресації важливо захиститись від того, filterщо це недійсне. Я звик var response = ...;if( response == null || response.Filter == null)return;.
Тревіс J

2
Також ви можете використовувати gzipспочатку замість deflate, читайте більше тут: stackoverflow.com/a/9856879/1026459
Travis J

IIS кешує стислі файли, тому для кращої продуктивності їх знову не доведеться стискати. Використовуйте IIS, якщо ви можете і використовувати цей підхід, лише якщо стиснення IIS вам недоступне.
Мухаммед Рехан Саїд

1
Жодне з цих рішень не працює на MVC5, IIS 8.5, .Net 4.5 Localhost. Що мені робити, якісь пропозиції?
aadi1295

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.