Wie aktiviere ich die gzip-Komprimierung, wenn ich MVC3 unter IIS7 verwende?

100

Weiß jemand, wie man die gzip-Komprimierung in MVC 3 aktiviert? Ich verwende IIS7.

Ergebnis von Google Chrome Audit:

  1. Gzip-Komprimierung aktivieren (4)
  2. Durch das Komprimieren der folgenden Ressourcen mit gzip kann die Übertragungsgröße um etwa zwei Drittel (~ 92,23 KB) verringert werden:
  3. / mydomain / könnte ~ 1,53 KB sparen
  4. jquery-1.4.4.min.js könnte ~ 51,35 KB sparen
  5. Cufon.js könnte ~ 11,89 KB sparen
  6. Futura.js könnte ~ 27,46 KB sparen
imarkic84
quelle
Nicht ruhig ein Duplikat: stackoverflow.com/q/552317/712526
jpaugh

Antworten:

142

Sie können die Komprimierung über Ihre web.configDatei wie folgt konfigurieren :

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

Eine Dokumentation dieses Konfigurationselements finden Sie unter iis.net/ConfigReference . Dies entspricht:

  1. Öffnen von Internetinformationsdiensten (IIS-Manager)
  2. Navigieren Sie durch die Baumansicht links, bis Sie das virtuelle Verzeichnis erreichen, das Sie ändern möchten
  3. Wählen Sie das entsprechende virtuelle Verzeichnis aus, sodass der Titel des rechten Bereichs zum Namen des virtuellen Verzeichnisses wird.
  4. Wählen Sie im rechten Bereich unter "IIS" die Option "Komprimierung"
  5. Aktivieren Sie beide Optionen und wählen Sie "Anwenden" unter "Aktionen" ganz rechts.

Hinweis: (Wie in den Kommentaren erwähnt) Sie müssen sicherstellen, dass die dynamische HTTP-Komprimierung installiert ist, da sonst die Einstellung doDynamicCompression="true"keine Auswirkungen hat. Der schnellste Weg, dies zu tun, ist:

  1. Start> Typ optionalfeatures(dies ist der schnellste Weg, um zum Fenster "Windows-Funktionen ein- oder ausschalten" zu gelangen)
  2. Navigieren Sie in der Baumansicht "Windows-Funktionen" zu Internetinformationsdienste> World Wide Web Services> Leistungsfunktionen
  3. Stellen Sie sicher, dass "Dynamische Inhaltskomprimierung" aktiviert ist
  4. Klicken Sie auf "OK" und warten Sie, während Windows die Komponente installiert
rauben
quelle
11
Es ist erwähnenswert, dass Sie die Option Http Compression Dynamic IIS installiert haben müssen, damit dies funktioniert. Der Konfigurationsreferenzlink in dieser Antwort enthält die Details.
Caleb Vear
16
Unter Windows Server 2008 optionalfeatureshat es bei mir nicht funktioniert. Navigieren Sie stattdessen zu Server-Manager> Rollen> Zu Webserver (IIS) blättern> klicken Sie auf Rollendienste hinzufügen. Stellen Sie nun sicher, dass Webserver> Leistung> Statische Inhaltskomprimierung und Dynamische Inhaltskomprimierung installiert sind.
Rory
1
Beachten Sie, dass dies Ihren Host-Header "Vary:" durcheinander bringen kann. Weitere Informationen: stackoverflow.com/questions/5372052/…
jjxtra
2
Zumindest meiner Erfahrung nach komprimiert dies alles, ABER die Ausgabe von MVC-Controllern. Sie geben aus irgendeinem Grund HTML ohne GZIP-Komprimierung zurück.
Chris Moschini
1
Vorsicht !!! Die dynamische IIS-Komprimierung entfernt unterschiedliche Header. Es ist ein Fehler oder eine Funktion, die ich nicht kenne. Die Implementierung eines benutzerdefinierten Filters ist jedoch sinnvoller, wenn der Cache ordnungsgemäß funktionieren soll.
Akash Kava
31

Sie könnten dies im Code tun, wenn Sie das lieber tun. Ich würde einen Basiscontroller erstellen, von dem jedes Steuerelement erbt, und ihn mit diesem Attribut unten dekorieren.

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
quelle
2
@JustAnotherUserYouMayKnow - hängt davon ab, wie Sie Ihre Ressourcen bereitstellen. Wenn Sie direkt auf Dateien auf dem Server zeigen, dann nein. Wenn Sie sie jedoch über Aktionen bereitstellen (wie es unser Ressourcenverwaltungssystem zulässt), funktioniert dies hervorragend. Übrigens hat Rick Strahl dies aktualisiert, um zu überprüfen, ob der Client gzip
Paul Carroll,
4
Beachten Sie, dass es für die Umleitung wichtig ist, sich vor filterNull zu schützen . Ich habe benutzt var response = ...;if( response == null || response.Filter == null)return;.
Travis J
2
Vielleicht möchten Sie auch gzipzuerst verwenden, anstatt deflatemehr hier zu lesen: stackoverflow.com/a/9856879/1026459
Travis J
IIS speichert komprimierte Dateien zwischen, sodass sie für eine bessere Leistung nicht erneut komprimiert werden müssen. Verwenden Sie IIS, wenn Sie können, und verwenden Sie diesen Ansatz nur, wenn Ihnen die IIS-Komprimierung nicht zur Verfügung steht.
Muhammad Rehan Saeed
1
Keine dieser Lösungen funktioniert unter MVC5, IIS 8.5, .Net 4.5 Localhost. Was soll ich tun, irgendwelche Vorschläge?
aadi1295
12

Die Komprimierung ist auf Serverebene aktiviert / deaktiviert. Siehe IIS-Komprimierungsmodul in der iis-Verwaltungskonsole.

Hier finden Sie die Anweisungen für IIS von der Microsoft-Website.

Nakhli
quelle
1
Sie können es auch in der web.config einstellen
Jack Marchetti