Bagaimana cara mengaktifkan kompresi gzip saat menggunakan MVC3 di IIS7?

100

Apakah ada yang tahu cara mengaktifkan kompresi gzip di MVC 3? Saya menggunakan IIS7.

Hasil Audit Google Chrome:

  1. Aktifkan kompresi gzip (4)
  2. Mengompresi sumber daya berikut dengan gzip dapat mengurangi ukuran transfer sekitar dua pertiga (~ 92.23KB):
  3. / mydomain / dapat menghemat ~ 1.53KB
  4. jquery-1.4.4.min.js bisa menghemat ~ 51.35KB
  5. Cufon.js bisa menghemat ~ 11.89KB
  6. Futura.js bisa menghemat ~ 27.46KB
imarkic84.dll
sumber
Tidak diam duplikat: stackoverflow.com/q/552317/712526
jpaugh

Jawaban:

143

Anda dapat mengonfigurasi kompresi melalui web.configfile Anda sebagai berikut:

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

Anda dapat menemukan dokumentasi elemen konfigurasi ini di iis.net/ConfigReference . Ini sama dengan:

  1. Membuka Layanan Informasi Internet (Manajer IIS)
  2. Menavigasi melalui tampilan pohon di sebelah kiri hingga Anda mencapai direktori virtual yang ingin Anda ubah
  3. Memilih direktori virtual yang sesuai sehingga judul panel kanan menjadi nama direktori virtual tersebut.
  4. Memilih "Kompresi" di bawah "IIS" di panel sebelah kanan
  5. Mencentang kedua opsi dan memilih "Terapkan" di bawah "Tindakan" di ujung kanan.

Catatan: (Seperti yang ditunjukkan di komentar) Anda perlu memastikan bahwa Http Dynamic Compression diinstal jika tidak pengaturan doDynamicCompression="true"tidak akan berpengaruh apa pun. Cara tercepat untuk melakukannya adalah:

  1. Mulai> Ketik optionalfeatures(ini adalah cara tercepat untuk membuka jendela "Mengaktifkan atau Menonaktifkan Fitur Windows")
  2. Arahkan ke Layanan Informasi Internet> Layanan World Wide Web> Fitur Performa di tampilan pohon "Fitur Windows"
  3. Pastikan "Kompresi Konten Dinamis" dicentang
  4. Klik "Ok" dan tunggu sementara Windows menginstal komponen
rampok
sumber
11
Perlu dicatat bahwa Anda harus memiliki opsi Http Compression Dynamic IIS diinstal agar ini berfungsi. Tautan referensi konfigurasi dalam jawaban ini memiliki detailnya.
Caleb Vear
16
Di Windows Server 2008 optionalfeaturestidak berhasil untuk saya. Sebaliknya, navigasikan ke Server Manager> Peran> Gulir ke Server Web (IIS)> klik Tambahkan Layanan Peran. Sekarang pastikan bahwa Web Server> Performance> Static Content Compression dan Dynamic Content Compression sudah diinstal.
Rory
1
Ketahuilah bahwa ini dapat mengacaukan header host "Vary:" Anda. Info lebih lanjut: stackoverflow.com/questions/5372052/…
jjxtra
2
Setidaknya dalam pengalaman saya ini memampatkan semuanya TAPI output dari Pengendali MVC. Karena alasan tertentu, mereka mengembalikan HTML tanpa kompresi gzip.
Chris Moschini
1
Peringatan !!! IIS Dynamic Compression menghapus header Vary, ini adalah bug atau fitur, saya tidak tahu, tetapi menerapkan Filter kustom lebih masuk akal jika Anda ingin cache berfungsi dengan benar.
Akash Kava
31

Anda dapat melakukan ini dalam kode jika Anda lebih suka melakukannya. Saya akan membuat basecontroller yang diwarisi oleh setiap kontrol dan menghiasinya dengan atribut di bawah ini.

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
sumber
2
@JustAnotherUserYouMayKnow - bergantung pada cara Anda menyajikan sumber daya; jika Anda menunjuk langsung ke file di server maka tidak, namun jika Anda menyajikannya melalui tindakan (karena sistem manajemen sumber daya kami mengizinkan kami) maka itu bekerja dengan sangat baik. BTW Rick Strahl telah memperbarui ini untuk mendukung pemeriksaan bahwa klien benar-benar mendukung gzip sebelum mengompresi
Paul Carroll
4
Perhatikan bahwa untuk pengalihan, penting untuk melindungi agar tidak filtermenjadi null. Saya dulu var response = ...;if( response == null || response.Filter == null)return;.
Travis J
2
Selain itu, Anda mungkin ingin menggunakan yang gzippertama daripada deflate, baca lebih lanjut di sini: stackoverflow.com/a/9856879/1026459
Travis J
IIS menyimpan file terkompresi dalam cache, sehingga tidak perlu mengompresnya lagi untuk kinerja yang lebih baik. Gunakan IIS jika Anda dapat dan hanya menggunakan pendekatan ini jika kompresi IIS tidak tersedia untuk Anda.
Muhammad Rehan Saeed
1
Tak satu pun dari solusi ini bekerja pada MVC5, IIS 8.5, .Net 4.5 Localhost. Apa yang harus saya lakukan, ada saran?
aadi1295
12

Kompresi diaktifkan / dinonaktifkan di tingkat server. Lihat modul kompresi IIS di konsol manajemen iis.

Berikut adalah instruksi untuk IIS dari situs microsoft.

nakhli
sumber
1
Anda juga dapat menyetelnya di web.config
Jack Marchetti