Wie implementiert man die GZip-Komprimierung in ASP.NET?

Ich versuche, GZip-Komprimierung für meine asp.net-Seite (einschließlich meiner CSS- und JS-Dateien) zu implementieren. Ich habe den folgenden Code ausprobiert, aber es komprimiert nur meine .aspx-Seite (gefunden von YSlow )

HttpContext context = HttpContext.Current; context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress); HttpContext.Current.Response.AppendHeader("Content-encoding", "gzip"); HttpContext.Current.Response.Cache.VaryByHeaders["Accept-encoding"] = true; 

Der obige Code komprimiert nur meinen ASPX-Seitencode (Markup), nicht die CSS- und JS-Dateien, die als externe Dateien enthalten sind. Bitte sagen Sie mir, wie ich die GZip-Komprimierung in ASP.NET mithilfe von Code implementieren kann (weil ich auf einem Shared Hosting-Server bin, auf dem ich keinen Zugriff auf IIS Server-Konfigurationen habe). Und auch im obigen Code bekomme ich nicht die letzten zwei Zeilen, warum sie verwendet werden und was der Zweck dieser Zeilen ist. Bitte erkläre!

Vielen Dank

Zum Komprimieren von JS- und CSS-Dateien müssen Sie dies auf der IIS-Ebene behandeln, da diese Dateien direkt ohne die ASP.NET-Laufzeit gerendert werden.

Sie können eine JSX- und CSSX-Erweiterungszuordnung in IIS zur aspnet_isapi.dll machen und dann Ihre Postleitzahl nutzen, aber IIS wird wahrscheinlich eine bessere Arbeit für Sie erledigen.

Der Content-Encoding-Header teilt dem Browser mit, dass er den Inhalt vor dem Rendern entzippen muss. Einige Browser sind schlau genug, um dies herauszufinden, basierend auf der Form des Inhalts, aber es ist besser, es einfach zu erzählen.

Die Cacheeinstellung “Accept-encoding” ist vorhanden, sodass eine zwischengespeicherte Version des gezippten Inhalts nicht an einen Browser gesendet wird, der nur text / html angefordert hat.

Hier ist die Lösung für CSS- und Javascript-Dateien

                  

Kredit: Wie man auf ASP.NET und GoDaddy GZip

Der Grund, warum es nur Ihre ASPX-Datei komprimiert, ist, dass der Code, den Sie geschrieben haben, nur in die ASPX-Datei eingebettet ist. Eine ASPX-Datei ist eine separate Anfrage von allen darin enthaltenen verknüpften Inhalten. Wenn Sie also eine ASPX-Seite haben, die Folgendes enthält:

 example 

Dies würde 2 Anfragen (DNS-Lookups beiseite) von Ihrem Browser zu den Ressourcen betragen:

  1. für die Aspx-Seite und
  2. für das Bild, das in der aspx-Seite enthalten ist.

Jede Anfrage hat ihre eigene Reaktionszeit. Der Code, den Sie gepostet haben, wird nur an den ASPX-Antwortstream angehängt, weshalb nur Ihre ASPX-Seite komprimiert wird. Die Zeilen 1 und 2 Ihres geposteten Codes übernehmen im Wesentlichen den normalen Antwortstrom der Seite und injizieren etwas “Middle-Man” -Code, der in diesem Fall den normalen Ausgabestrom mit einem GZip-Stream auffrischt und komprimiert und diesen stattdessen über die Leitung sendet.

Die Zeilen 3 und 4 richten die Antwortheader ein. Alle HTTP-Anfragen und Antworten haben Header, die vor dem Inhalt gesendet werden. Diese richten die Anfrage / Antwort so ein, dass der Server und der Client wissen, was gesendet wird und wie.

In diesem Fall informiert Zeile 3 den Client-Browser, dass der Antwortstream über gzip komprimiert wurde und daher vor der Anzeige vom Client-Browser dekomprimiert werden muss.

Und Zeile 4 aktiviert einfach den Accept-Encoding-Header der Antwort. Dies wäre sonst in der Antwort nicht vorhanden gewesen.

Es gibt steckbare Module, die Sie schreiben / beschaffen können, die Ihnen erlauben, eine Multitide eines anderen MIME-Typs wie * .js und * .css zu komprimieren, aber Sie sind besser dran, wenn Sie nur die eingebaute Komprimierungsfunktionalität von IIS verwenden.

Sie haben nicht angegeben, welche Version von IIS Sie verwenden, aber wenn es IIS 7.0 wäre, müssten Sie etwa Folgendes in den Abschnitt Ihrer Datei web.config einfügen:

        

..

Richard

Dies kann nützlich sein, wenn Sie es ausprobieren, dies akzeptiert deflate und gzip Kompression.

  void Application_PreRequestHandlerExecute(object sender, EventArgs e) { HttpApplication app = sender as HttpApplication; string acceptEncoding = app.Request.Headers["Accept-Encoding"]; Stream prevUncompressedStream = app.Response.Filter; if (app.Context.CurrentHandler == null) return; if (!(app.Context.CurrentHandler is System.Web.UI.Page || app.Context.CurrentHandler.GetType().Name == "SyncSessionlessHandler") || app.Request["HTTP_X_MICROSOFTAJAX"] != null) return; if (acceptEncoding == null || acceptEncoding.Length == 0) return; acceptEncoding = acceptEncoding.ToLower(); if (acceptEncoding.Contains("deflate") || acceptEncoding == "*") { // deflate app.Response.Filter = new DeflateStream(prevUncompressedStream, CompressionMode.Compress); app.Response.AppendHeader("Content-Encoding", "deflate"); } else if (acceptEncoding.Contains("gzip")) { // gzip app.Response.Filter = new GZipStream(prevUncompressedStream, CompressionMode.Compress); app.Response.AppendHeader("Content-Encoding", "gzip"); } } 

In IIS7 werden alle Anforderungen an .net weitergeleitet, sodass Sie ein HttpModule erstellen müssen, das diese Header allen Antworten hinzufügt.

Ohne IIS7 und Shared Hosting müssten Sie einen Handler erstellen, der eine Erweiterung für .net-Dateien abbildet, die Sie nicht verwenden (wie .asmx), und in der Datei web.config angeben, dass .asmx-Dateien zu Ihrem gesetzten HttpHandler gehen um den Pfad zu .jpg oder was auch immer neu zu schreiben und den Header dort auch zu setzen.

Um deine letzte Frage zu beantworten. Diese beiden Zeilen setzen HTTP-Header für die Antwort, die an den Browser zurückgesendet wird. Content-Encoding teilt dem Browser mit, dass die Antwort als gzip codiert ist und entschlüsselt werden muss. Die letzte Zeile fügt dem Vary-Header Accept-Encoding hinzu. Damit können der Browser oder Proxys feststellen, ob die Antwort eindeutig war oder von bestimmten anderen Überschriften beeinflusst wird und ihre Zwischenspeicherung anpassen.

Fügen Sie eine ASPX-Erweiterung zu .css- oder .js-Datei hinzu. Verwenden Sie < % @ Page ContentType = "text / css"%> oder JavaScript in der Datei, um sie mit dem richtigen MIME-Typ zu versehen. Verwenden Sie URL Rewrite, um dies vor den Browsern des Benutzeragenten zu verbergen. Der Content-Encoding-Antwortheader wird an gzip angehängt, um zu vermitteln, dass gzip die Methode ist, die zum Ausführen der Komprimierung verwendet wird. Vary Response Header ist auf Accept-Encoding gesetzt, so dass alle Caches wissen, welche Seite (komprimiert oder unkomprimiert) bedient werden soll, hängt von Accept-Encoding Header der Anfrage ab. Ich habe dies unter https://stackoverflow.com/a/14509007/1624169 erläutert

Sie können Ihrer web.config-Datei innerhalb des Elements Folgendes hinzufügen:

  

Hinweis: Wenn Sie eine ältere Version von IIS (weniger als Version 7.5) verwenden, sollten Sie doDynamicCompression auf false festlegen, da der process CPU-intensiv war. Diese Probleme wurden in IIS 7.5 behoben.

Referenz: https://docs.microsoft.com/en-us/iis/configuration/system.webserver/urlcompression