Come si abilita la compressione gzip quando si utilizza MVC3 su IIS7?


100

Qualcuno sa come abilitare la compressione gzip in MVC 3? Sto usando IIS7.

Risultato di Google Chrome Audit:

  1. Abilita compressione gzip (4)
  2. La compressione delle seguenti risorse con gzip potrebbe ridurre le dimensioni di trasferimento di circa due terzi (~ 92,23 KB):
  3. / miodominio / potrebbe salvare ~ 1,53 KB
  4. jquery-1.4.4.min.js potrebbe far risparmiare ~ 51,35 KB
  5. Cufon.js potrebbe far risparmiare ~ 11,89 KB
  6. Futura.js potrebbe far risparmiare ~ 27,46 KB

Non tranquillo un duplicato: stackoverflow.com/q/552317/712526
jpaugh

Risposte:


143

È possibile configurare la compressione tramite il web.configfile come segue:

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

È possibile trovare la documentazione di questo elemento di configurazione su iis.net/ConfigReference . Questo è l'equivalente di:

  1. Apertura di Internet Information Services (Gestione IIS)
  2. Navigando attraverso la visualizzazione ad albero a sinistra fino a raggiungere la directory virtuale che desideri modificare
  3. Selezionare la directory virtuale appropriata in modo che il titolo del riquadro di destra diventi il ​​nome di detta directory virtuale.
  4. Scegliendo "Compressione" sotto "IIS" nel riquadro di destra
  5. Spuntando entrambe le opzioni e scegliendo "Applica" sotto "Azioni" all'estrema destra.

Nota: (come sottolineato nei commenti) è necessario assicurarsi che sia installato Http Dynamic Compression altrimenti l'impostazione doDynamicCompression="true"non avrà alcun effetto. Il modo più rapido per farlo è:

  1. Start> Digita optionalfeatures(questo è il modo più rapido per accedere alla finestra "Attiva o disattiva le funzionalità di Windows")
  2. Accedere a Internet Information Services> Servizi World Wide Web> Funzionalità di prestazione nella visualizzazione ad albero "Funzionalità di Windows"
  3. Assicurati che "Compressione dinamica del contenuto" sia spuntato
  4. Fai clic su "Ok" e attendi che Windows installi il componente

11
Vale la pena notare che è necessario disporre dell'opzione IIS dinamica di compressione HTTP installata affinché funzioni. Il collegamento di riferimento alla configurazione in questa risposta contiene i dettagli.
Caleb Vear

16
Su Windows Server 2008 optionalfeaturesnon ha funzionato per me. Invece, vai a Server Manager> Ruoli> Scorri fino a Server Web (IIS)> fai clic su Aggiungi servizi ruolo. Ora assicurati che Server Web> Prestazioni> Compressione contenuto statico e Compressione contenuto dinamico siano installati.
Rory

1
Tieni presente che questo può rovinare la tua intestazione host "Vary:". Maggiori informazioni: stackoverflow.com/questions/5372052/...
jjxtra

2
Almeno nella mia esperienza questo comprime tutto MA l'output dei controller MVC. Per qualche motivo restituiscono HTML senza alcuna compressione gzip.
Chris Moschini

1
Attenzione !!! La compressione dinamica IIS rimuove le intestazioni Vary, è un bug o una funzionalità, non lo so, ma l'implementazione del filtro personalizzato ha più senso se si desidera che la cache funzioni correttamente.
Akash Kava,

31

Potresti farlo in codice se preferisci farlo. Vorrei creare un controller di base da cui eredita ogni controllo e decorarlo con questo attributo di seguito.

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 - dipende da come stai servendo le tue risorse; se stai puntando direttamente ai file sul server, allora no, tuttavia se li servi tramite azioni (come il nostro sistema di gestione delle risorse ci consente), funziona perfettamente. BTW Rick Strahl ha aggiornato questo per supportare il controllo che il client supporti
Paul Carroll

4
Si noti che per il reindirizzamento è importante proteggersi filterdall'essere nulli. Ho usato var response = ...;if( response == null || response.Filter == null)return;.
Travis J

2
Inoltre, potresti voler usare gzipprima invece di deflate, leggi di più qui: stackoverflow.com/a/9856879/1026459
Travis J

IIS memorizza nella cache i file compressi, quindi non dovrà comprimerli di nuovo per ottenere prestazioni migliori. Utilizza IIS se puoi e utilizza questo approccio solo se la compressione IIS non è disponibile.
Muhammad Rehan Saeed

1
Nessuna di queste soluzioni funziona su MVC5, IIS 8.5, .Net 4.5 Localhost. Cosa devo fare, qualche suggerimento?
aadi1295

12

La compressione è abilitata / disabilitata a livello del server. Vedere il modulo di compressione IIS nella console di gestione iis.

Ecco le istruzioni per IIS dal sito microsoft.


1
Puoi impostarlo anche nel web.config
Jack Marchetti
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.