IIS7'de MVC3 kullanırken gzip sıkıştırmasını nasıl etkinleştiririm?


101

MVC 3'te gzip sıkıştırmasının nasıl etkinleştirileceğini bilen var mı? IIS7 kullanıyorum.

Google Chrome Denetiminin sonucu:

  1. Gzip sıkıştırmayı etkinleştir (4)
  2. Aşağıdaki kaynakları gzip ile sıkıştırmak, aktarım boyutlarını yaklaşık üçte iki oranında azaltabilir (~ 92,23KB):
  3. / alanim / ~ 1,53 KB tasarruf sağlayabilir
  4. jquery-1.4.4.min.js ~ 51,35 KB tasarruf sağlayabilir
  5. Cufon.js ~ 11,89 KB tasarruf sağlayabilir
  6. Futura.js ~ 27.46KB tasarruf sağlayabilir

Bir kopya sessiz değil: stackoverflow.com/q/552317/712526
jpaugh

Yanıtlar:


143

web.configDosyanız aracılığıyla sıkıştırmayı şu şekilde yapılandırabilirsiniz :

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

Bu yapılandırma öğesinin belgelerini iis.net/ConfigReference adresinde bulabilirsiniz . Bu şuna eşdeğerdir:

  1. İnternet Bilgi Hizmetlerini Açma (IIS Yöneticisi)
  2. Değiştirmek istediğiniz sanal dizine ulaşana kadar soldaki ağaç görünümünde gezinmek
  3. Sağ taraftaki bölmenin başlığının söz konusu sanal dizinin adı olacağı şekilde uygun sanal dizinin seçilmesi.
  4. Sağ taraftaki bölmede "IIS" altında "Sıkıştırma" yı seçme
  5. Her iki seçeneği de işaretleyin ve en sağdaki "İşlemler" altında "Uygula" yı seçin.

Not: (Yorumlarda belirtildiği gibi) Http Dinamik Sıkıştırma'nın kurulu olduğundan emin olmanız gerekir, aksi takdirde ayarın doDynamicCompression="true"herhangi bir etkisi olmayacaktır. Bunu yapmanın en hızlı yolu:

  1. Başlat> Yaz optionalfeatures(bu, "Windows Özelliklerini Açma veya Kapatma" penceresine gitmenin en hızlı yoludur)
  2. "Windows Özellikleri" ağaç görünümünde İnternet Bilgi Hizmetleri> World Wide Web Hizmetleri> Performans Özellikleri'ne gidin.
  3. "Dinamik İçerik Sıkıştırma" nın işaretli olduğundan emin olun
  4. "Tamam" ı tıklayın ve Windows bileşeni yüklerken bekleyin

11
Bunun çalışması için Http Sıkıştırma Dinamik IIS seçeneğinin kurulu olması gerektiğini belirtmek gerekir. Bu yanıttaki yapılandırma referans bağlantısı ayrıntılara sahiptir.
Caleb Vear

16
Windows Server 2008'de optionalfeaturesbenim için çalışmadı. Bunun yerine, Sunucu Yöneticisi> Roller> Web Sunucusuna Kaydır (IIS)> Rol Hizmetleri Ekle'ye tıklayın. Şimdi Web Sunucusu> Performans> Statik İçerik Sıkıştırma ve Dinamik İçerik Sıkıştırma'nın kurulu olduğundan emin olun.
Rory

1
Bunun "Vary:" ana bilgisayar başlığınızı bozabileceğini unutmayın. Daha fazla bilgi: stackoverflow.com/questions/5372052/…
jjxtra

2
En azından benim deneyimlerime göre bu, MVC Kontrolörlerinin çıktıları DIŞINDA her şeyi sıkıştırıyor. Herhangi bir nedenle herhangi bir gzip sıkıştırması olmadan HTML döndürürler.
Chris Moschini

1
Dikkat !!! IIS Dinamik Sıkıştırma, Değişken başlıklarını kaldırıyor, bu bir hata veya özellik, bilmiyorum, ancak önbelleğin düzgün çalışmasını istiyorsanız özel Filtre uygulamak daha mantıklı.
Akash Kava

31

Bunu yapmayı tercih ederseniz, bunu kodla yapabilirsiniz. Her denetimin miras aldığı bir temel denetleyici yapardım ve onu aşağıdaki bu öznitelikle dekore ederdim.

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
@JustAnotherUserYouMayKnow - kaynaklarınıza nasıl hizmet ettiğinize bağlıdır; doğrudan sunucudaki dosyalara işaret ediyorsanız hayır, ancak bunları eylemler yoluyla sunuyorsanız (kaynak yönetimi sistemimizin bize izin verdiği gibi) o zaman mükemmel çalışır. BTW Rick Strahl, istemcinin sıkıştırmadan önce gzip'i
Paul Carroll

4
Yeniden yönlendirme için boşluğa karşı korumanın önemli olduğunu unutmayın filter. Kullandım var response = ...;if( response == null || response.Filter == null)return;.
Travis J

2
Ayrıca, gzipbunun yerine ilkini kullanmak isteyebilirsiniz deflate, buradan daha fazlasını okuyun: stackoverflow.com/a/9856879/1026459
Travis J

IIS sıkıştırılmış dosyaları önbelleğe alır, bu nedenle daha iyi performans için onları yeniden sıkıştırması gerekmez. Bu yaklaşımı yapabiliyorsanız ve yalnızca IIS sıkıştırması sizin için mevcut değilse IIS'yi kullanın.
Muhammad Rehan Saeed

1
Bu çözümlerden hiçbiri MVC5, IIS 8.5, .Net 4.5 Localhost üzerinde çalışmıyor. Ne yapmalıyım, herhangi bir önerim var mı?
aadi1295

12

Sıkıştırma, sunucu düzeyinde etkinleştirilir / devre dışı bırakılır. İis yönetim konsolunda IIS sıkıştırma modülüne bakın.

İşte microsoft sitesinden IIS için talimatlar .


1
SEN bunu web.config içinde de ayarlayabilirsiniz
Jack Marchetti
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.