81 votes

Comment mettre en œuvre la compression GZip dans ASP.NET?

Je suis en train de mettre en œuvre la compression GZip pour mon asp.net page (mes, y compris les fichiers CSS et JS). J'ai essayé le code suivant, mais il ne compresse mon .page aspx (trouvé de 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;

Le code ci-dessus est seulement en comprimant mon .aspx code de la page (balisage) pas le CSS et le JS fichiers, qui est compris dans des fichiers externes. S'il vous plaît dites-moi comment puis-je mettre en œuvre la compression GZip dans ASP.NET à l'aide de code (parce que je suis sur le serveur d'hébergement mutualisé où je n'ai pas accès au Serveur IIS configurations). Et aussi dans le code ci-dessus, je ne reçois pas les deux dernières lignes, pourquoi ils sont utilisés et quel est le but de ces lignes. Veuillez expliquer!

Merci

47voto

dortzur Points 599

Voici la solution pour les fichiers css et javascript

<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>

Le crédit va à http://jeeshenlee.wordpress.com/2010/08/01/how-to-gzip-on-asp-net-and-godaddy/

28voto

Ben Scheirman Points 23590

Pour la compression JS & CSS fichiers que vous avez effectivement de gérer cela au niveau de IIS, puisque ces fichiers sont rendus directement, sans ASP.NET moment de l'exécution.

Vous pourriez faire un JSX & CSSX extension de la cartographie dans IIS pour l'aspnet_isapi.dll et puis profiter de votre code postal, mais IIS est susceptible de faire un meilleur travail pour vous.

Le codage de contenu d'en-tête indique au navigateur qu'il doit décompresser le contenu avant de le rendre. Certains navigateurs sont assez intelligents pour le comprendre de toute façon, en fonction de la forme du contenu, mais il est préférable de simplement le dire.

L'en-tête Accept-encoding paramètre de cache n'est là que pour une version en cache du contenu au format gzip ne sont pas envoyés à un navigateur qui a demandé seulement text/html.

16voto

Nudier Points 1056

cela peut être utile pour vous de l'essayer, ce n'accepte dégonfler et la compression gzip.

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

11voto

intermension Points 903

La raison, c'est seulement la compression de votre fichier ASPX est que le code que vous avez écrit n'est incorporé dans le fichier ASPX. Un fichier ASPX est une demande distincte de tout autre contenu qu'il contient. Donc, si vous avez une page ASPX qui contient:

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

Ce serait de 2 demandes (requêtes DNS de côté) à partir de votre navigateur pour les ressources:

  1. pour la page aspx et
  2. pour les images contenues dans la page aspx.

Chaque demande a sa propre réponse à la vapeur. Le code que vous avez posté est de fixer la ASPX flux de réponse seulement, c'est pourquoi seulement votre page ASPX est comprimé. Les lignes 1 et 2 de votre posté code sont essentiellement la prise de cours de la réponse normale de flux de la page et l'injection de certains "homme du milieu" code que dans ce cas, mange et comprime la normale flux de sortie avec un GZip flux et les envoie vers le bas le fil à la place.

Les lignes 3 et 4 de la définition de l'en-têtes de réponse. Toutes les requêtes http et les réponses ont des en-têtes envoyés avant le contenu. Ceux-ci l'ensemble de la demande/réponse, de sorte que le serveur et le client sait ce qui est envoyé et comment.

Dans ce cas, la Ligne 3 est d'informer le client de navigateur que le flux de réponse est compressé par gzip et, par conséquent, doit être décompressé par le navigateur client avant l'affichage.

Et la Ligne 4 est tout simplement d'allumer l'-tête Accept-Encoding de la réponse. Ce qui aurait autrement été absent de la réponse.

Il y a des modules enfichables vous pouvez écrire et d'obtenir qui vous permettent de compresser une multitide d'autres type MIME tels que *.js et *.css, mais vous êtes mieux de simplement en utilisant le construit dans la fonctionnalité de compression de IIS.

Vous n'avez pas dit qui verson de IIS que vous utilisez, mais si c'était IIS 7.0, il faudrait que vous inclure quelque chose comme ce qui suit dans l' <system.webserver> de la section de vous web.fichier de configuration:

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

..

Richard

3voto

rizzle Points 3127

Dans IIS7 toutes les demandes .net, donc vous aurez à créer un HttpModule que l'ajout de ces en-têtes à toutes les réponses.

Sans IIS7, et sur l'hébergement mutualisé, vous devez creare un gestionnaire qui a tracé une feuille .net fichier de l'extension que vous n'utilisez pas (comme .asmx) et dans le site web.config préciser que .asmx fichiers d'aller à votre HttpHandler qui est à réécrire le chemin d'accès .jpg ou autre et la tête là-bas aussi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X