it-swarm.com.de

Wie implementiere ich die GZip-Komprimierung in ASP.NET?

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 (fand sie 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 erklären Sie mir, wie ich die GZip-Komprimierung in ASP.NET mithilfe von Code implementieren kann (da ich mich auf einem Shared Hosting-Server befinde, auf den 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

75
Prashant

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

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

Der Content-Encoding-Header teilt dem Browser mit, dass er den Inhalt vor dem Rendern entpacken muss. Einige Browser sind intelligent genug, um dies je nach der Form des Inhalts herauszufinden, aber es ist besser, es nur zu sagen.

Die Einstellung Accept-Encoding Cache ist so eingestellt, dass eine zwischengespeicherte Version des komprimierten Inhalts nicht an einen Browser gesendet wird, der nur Text/HTML angefordert hat.

27
Ben Scheirman

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

<httpCompression>
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
    <dynamicTypes>
      <add mimeType="text/*" enabled="true"/>
      <add mimeType="message/*" enabled="true"/>
      <add mimeType="application/javascript" enabled="true"/>
      <add mimeType="*/*" enabled="false"/>
    </dynamicTypes>
    <staticTypes>
      <add mimeType="text/*" enabled="true"/>
      <add mimeType="message/*" enabled="true"/>
      <add mimeType="application/javascript" enabled="true"/>
      <add mimeType="*/*" enabled="false"/>
    </staticTypes>
  </httpCompression>
  <urlCompression doStaticCompression="true" doDynamicCompression="true"/>
</system.webServer>

Gutschrift: Wie man auf ASP.NET und GoDaddy GZip

41
dortzur

Der Grund dafür ist, dass Ihre ASPX-Datei nur komprimiert wird, weil 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: 

<img src="www.example.com\exampleimg.jpg" alt="example" />

Dies würde 2 Anfragen (DNS-Lookups beiseite) von Ihrem Browser an die Ressourcen betreffen:

  1. für die aspx-Seite und 
  2. für das auf der aspx-Seite enthaltene Bild.

Jede Anfrage hat ihre eigene Antwort Steam. Der von Ihnen bereitgestellte Code hängt nur an den ASPX-Antwortstream an, weshalb nur Ihre ASPX-Seite komprimiert wird. Die Zeilen 1 und 2 Ihres geposteten Codes übernehmen im Wesentlichen den normalen Antwortstream der Seite und fügen etwas "Middle Man" -Code ein, der in diesem Fall den normalen Ausgabestrom mit einem GZip-Stream frisst und komprimiert und stattdessen über das Kabel sendet.

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

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

Und Zeile 4 schaltet einfach den Accept-Encoding-Header der Antwort ein. Dies wäre sonst in der Antwort nicht enthalten.

Es gibt steckbare Module, die Sie schreiben/beziehen können, um mehrere MIME-Typen wie * .js und * .css zu komprimieren. Sie können jedoch besser die integrierte Komprimierungsfunktion von IIS verwenden. 

Sie haben nicht gesagt, welchen verson 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 einfügen:

<httpCompression> 
  <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" /> 
 <staticTypes>
         <add mimeType="text/*" enabled="true" />
      </staticTypes>
</httpCompression> 
<urlCompression doStaticCompression="true" /> 

..

Richard

11
intermension

dies kann nützlich sein, wenn Sie es ausprobieren möchten. Dies akzeptiert Deflate und GZIP-Komprimierung.

    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");
        }
    } 
11
Nudier Mena

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 Shared Hosting müssten Sie einen Handler erstellen, der eine .net-Dateierweiterung zugeordnet hat, die Sie nicht verwenden (wie .asmx), und in der Datei web.config angeben, dass die .asmx-Dateien zu Ihrem HttpHandler-Speicher gelangen um den Pfad in .jpg oder was auch immer umzuschreiben und den Header dort zu setzen.

3
rizzle

Um deine letzte Frage zu beantworten. Diese beiden Zeilen setzen HTTP-Header für die an den Browser zurückgesendete Antwort. Content-Encoding teilt dem Browser mit, dass die Antwort als gzip codiert ist und decodiert werden muss. Die letzte Zeile fügt Accept-Encoding zum Vary-Header hinzu. Damit können der Browser oder die Stellvertreter feststellen, ob die Antwort eindeutig war oder von bestimmten anderen Kopfzeilen beeinflusst wird, und deren Caching anpassen.

2
gix

Fügen Sie die Erweiterung .aspx zur .css- oder .js-Datei hinzu. Verwenden Sie <% @ Page ContentType = "text/css"%> oder Javascript in der Datei, um den korrekten MIME-Typ bereitzustellen. & Verwenden Sie URL Rewrite, um dies vor den Benutzeragenten-Browsern zu verbergen. Der Content-Encoding-Antwortheader wird mit gzip angehängt, um zu vermitteln, dass gzip die Methode ist, die zur Komprimierung verwendet wird. Der Antwortheader ist auf Accept-Encoding festgelegt, sodass alle Caches wissen, welche Seite (komprimiert oder nicht komprimiert) geliefert werden soll. Dies hängt vom Accept-Encoding-Header der Anforderung ab. Ich habe dies unter https://stackoverflow.com/a/14509007/1624169 ausgeführt. 

0
Chawathe Vipul

Sie können der web.config-Datei innerhalb des <system.webServer>-Elements einfach Folgendes hinzufügen:

<urlCompression doStaticCompression="true" doDynamicCompression="true" />

ANMERKUNG: Wenn Sie eine ältere Version von IIS (weniger als Version 7.5) verwenden, sollten Sie doDynamicCompression auf false setzen, da der Prozess CPU-intensiv war. Diese Probleme wurden in IIS 7.5 geklärt.

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

0
Rick

Tun Sie dies entweder mit der Datei web.config

<system.webServer>
    <httpCompression>
        <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
        <dynamicTypes>
            <add mimeType="text/*" enabled="true"/>
            <add mimeType="message/*" enabled="true"/>
            <add mimeType="application/javascript" enabled="true"/>
            <add mimeType="*/*" enabled="false"/>
        </dynamicTypes>
        <staticTypes>
            <add mimeType="text/*" enabled="true"/>
            <add mimeType="message/*" enabled="true"/>
            <add mimeType="application/javascript" enabled="true"/>
            <add mimeType="*/*" enabled="false"/>
        </staticTypes>
    </httpCompression>
    <urlCompression doStaticCompression="true" doDynamicCompression="true"/>
</system.webServer>

Oder Sie können es über IIS tun. Zum Komprimieren von JS- und CSS-Dateien müssen Sie diese tatsächlich auf der Ebene IIS verarbeiten, 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 vornehmen und dann Ihre Postleitzahl nutzen, aber IIS wird dies wahrscheinlich besser für Sie erledigen .

Der Inhaltskodierungsheader teilt dem Browser mit, dass der Inhalt vor dem Rendern entpackt werden muss. Einige Browser sind schlau genug, um dies basierend auf der Form des Inhalts herauszufinden, aber es ist besser, es einfach zu sagen.

Die Cache-Einstellung "Codierung akzeptieren" ist vorhanden, damit eine zwischengespeicherte Version des gezippten Inhalts nicht an einen Browser gesendet wird, der nur Text/HTML angefordert hat.

0
JIYAUL MUSTAPHA