Ich versuche, die GZip-Komprimierung für meine asp.net-Seite (einschließlich meiner CSS- und JS-Dateien) zu implementieren. Ich habe den folgenden Code ausprobiert, aber er 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 (da ich mich auf einem gemeinsam genutzten Hosting-Server befinde, auf dem ich keinen Zugriff auf IIS-Serverkonfigurationen habe). Und auch im obigen Code bekomme ich nicht die letzten beiden Zeilen, warum sie verwendet werden und was der Zweck dieser Zeilen ist. Bitte erkläre!
c#
asp.net
compression
gzip
Prashant
quelle
quelle
Antworten:
Zum Komprimieren von JS- und CSS-Dateien müssen Sie dies tatsächlich auf IIS-Ebene behandeln, da diese Dateien direkt ohne die ASP.NET-Laufzeit gerendert werden.
Sie könnten eine JSX- und CSSX-Erweiterungszuordnung in IIS zur aspnet_isapi.dll erstellen und dann Ihre Postleitzahl nutzen, aber IIS wird dies wahrscheinlich besser für Sie erledigen.
Der Header für die Inhaltscodierung teilt dem Browser mit, dass er den Inhalt vor dem Rendern entpacken muss. Einige Browser sind klug genug, um dies anhand der Form des Inhalts herauszufinden, aber es ist besser, es einfach zu sagen.
Die Cache-Einstellung zum Akzeptieren der Codierung ist vorhanden, damit eine zwischengespeicherte Version des komprimierten Inhalts nicht an einen Browser gesendet wird, der nur Text / HTML anfordert.
quelle
Hier ist die Lösung für CSS- und Javascript-Dateien. Fügen Sie den folgenden Code in Ihre web.config-Datei ein:
Credit: Wie man auf ASP.NET und GoDaddy GZip
quelle
Dies kann nützlich sein, wenn Sie es ausprobieren. Dies akzeptiert die Deflate- und GZIP-Komprimierung.
quelle
gzip;q=0,deflate
. singular.co.nz/2008/07/…Der Grund dafür, dass nur Ihre ASPX-Datei komprimiert wird, ist, dass der von Ihnen geschriebene Code nur in die ASPX-Datei eingebettet ist. Eine ASPX-Datei ist eine separate Anforderung von allen darin enthaltenen verknüpften Inhalten. Wenn Sie also eine ASPX-Seite haben, die Folgendes enthält:
Dies entspricht 2 Anfragen (abgesehen von DNS-Lookups) von Ihrem Browser an die Ressourcen:
Jede Anfrage hat ihren eigenen Antwortdampf. Der von Ihnen veröffentlichte Code wird nur an den ASPX-Antwortstrom angehängt, weshalb nur Ihre ASPX-Seite komprimiert wird. Die Zeilen 1 und 2 Ihres veröffentlichten Codes übernehmen im Wesentlichen den normalen Antwortstrom der Seite und fügen einen "Middle Man" -Code ein, der in diesem Fall den normalen Ausgabestream mit einem GZip-Stream frisst und komprimiert und diesen stattdessen über den Draht 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 Server und Client wissen, was und wie gesendet wird.
In diesem Fall informiert Zeile 3 den Client-Browser darüber, dass der Antwortstrom über gzip komprimiert wird 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 enthalten gewesen.
Es gibt steckbare Module, die Sie schreiben / erhalten können, mit denen Sie eine Vielzahl anderer MIME-Typen wie * .js und * .css komprimieren können. Sie sollten jedoch nur die integrierte Komprimierungsfunktion von IIS verwenden.
Sie haben nicht gesagt, welche Version von IIS Sie verwenden, aber wenn es IIS 7.0 wäre, müssten Sie Folgendes in den
<system.webserver>
Abschnitt Ihrer web.config-Datei aufnehmen:..
Richard
quelle
In IIS7 gehen alle Anforderungen an .net, sodass Sie ein HttpModule erstellen müssen, das diese Header zu allen Antworten hinzufügt.
Ohne IIS7 und beim Shared Hosting müssten Sie einen Handler erstellen, der eine nicht verwendete .net-Dateierweiterung zuordnet (wie .asmx), und in der web.config angeben, dass .asmx-Dateien an Ihren festgelegten HttpHandler gesendet werden um den Pfad zu .jpg oder was auch immer umzuschreiben und dort auch den Header zu setzen.
quelle
Um Ihre letzte Frage zu beantworten. Diese beiden Zeilen legen HTTP-Header für die an den Browser zurückgesendete Antwort fest.
Content-Encoding
teilt dem Browser mit, dass die Antwort als gzip codiert ist und dekodiert werden muss. Die letzte Zeile wirdAccept-Encoding
zum Vary-Header hinzugefügt . Damit können der Browser oder die Proxys feststellen, ob die Antwort eindeutig war oder von bestimmten anderen Headern beeinflusst wird, und deren Caching anpassen.quelle
Fügen Sie der CSS- oder JS-Datei die ASPX-Erweiterung hinzu. Verwenden Sie <% @ Page ContentType = "text / css"%> oder Javascript in der Datei, um sie mit dem richtigen MIME-Typ bereitzustellen. & Verwenden Sie URL Rewrite, um dies vor den Browsern des Benutzeragenten zu verbergen. Der inhaltscodierende Antwortheader wird an gzip angehängt, um zu verdeutlichen, dass gzip die Methode zur Komprimierung ist. Der Antwortheader ist auf Accept-Encoding gesetzt, damit alle Caches wissen, welche Seite (komprimiert oder unkomprimiert) bedient werden soll. Dies hängt vom Accept-Encoding-Header der Anforderung ab. Ich habe dies unter https://stackoverflow.com/a/14509007/1624169 ausgeführt
quelle
Sie können Ihrer web.config-Datei innerhalb des
<system.webServer>
Elements einfach Folgendes hinzufügen :ANMERKUNG: Wenn Sie eine ältere Version von IIS (weniger als Version 7.5) verwenden, möchten Sie möglicherweise doDynamicCompression auf false setzen, da der Prozess CPU-intensiv war. Diese Probleme wurden in IIS 7.5 behoben.
Referenz: https://docs.microsoft.com/en-us/iis/configuration/system.webserver/urlcompression
quelle
Entweder mit der Datei web.config
Oder Sie können dies über IIS tun. Zum Komprimieren von JS- und CSS-Dateien müssen Sie dies tatsächlich auf IIS-Ebene behandeln, da diese Dateien direkt ohne die ASP.NET-Laufzeit gerendert werden.
Sie könnten eine JSX- und CSSX-Erweiterungszuordnung in IIS zur aspnet_isapi.dll erstellen und dann Ihre Postleitzahl nutzen, aber IIS wird dies wahrscheinlich besser für Sie erledigen.
Der Header für die Inhaltscodierung teilt dem Browser mit, dass er den Inhalt vor dem Rendern entpacken muss. Einige Browser sind klug genug, um dies anhand der Form des Inhalts herauszufinden, aber es ist besser, es einfach zu sagen.
Die Cache-Einstellung zum Akzeptieren der Codierung ist vorhanden, damit eine zwischengespeicherte Version des komprimierten Inhalts nicht an einen Browser gesendet wird, der nur Text / HTML anfordert.
quelle