2009-02-16 8 views
72

J'essaie d'implémenter la compression GZip pour ma page asp.net (y compris mes fichiers CSS et JS). J'ai essayé le code suivant, mais il ne compresse que ma page .aspx (trouvé de YSlow)Comment implémenter la compression GZip dans ASP.NET?

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 ne comprimant mon code page .aspx (balisage) pas le CSS et les fichiers JS qui est inclus en tant que fichiers externes. Dites-moi comment puis-je implémenter la compression GZip dans ASP.NET en utilisant du code (parce que je suis sur un serveur d'hébergement partagé où je n'ai pas accès aux configurations du serveur IIS). 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. S'il vous plaît, expliquez!

Merci

Répondre

26

pour la compression JS & fichiers CSS fait, vous devez gérer cela au niveau IIS, étant donné que ces fichiers sont rendus directement sans le runtime ASP.NET.

Vous pouvez créer un mappage d'extension JSX & CSSX dans IIS vers aspnet_isapi.dll, puis profiter de votre code postal, mais IIS est susceptible de faire un meilleur travail pour vous.

L'en-tête de codage de contenu indique au navigateur qu'il doit décompresser le contenu avant le rendu. Certains navigateurs sont assez intelligents pour comprendre cela, en fonction de la forme du contenu, mais il vaut mieux le dire. Le paramètre de cache Accept-encoding est présent afin qu'une version mise en cache du contenu gzippé ne soit pas envoyée à un navigateur qui n'a demandé que du texte/html.

+4

Salut @Ben, Pouvez-vous s'il vous plaît me dire comment compresser mes fichiers en utilisant IIS, ce que tous les paramètres que je dois effectuer, Bien que je n'ai pas accès aux configurations IIS, mais je Je vais essayer de le faire. S'il vous plaît dites-moi comment compresser les fichiers en utilisant IIS ?? Merci! – Prashant

+3

http://stackoverflow.com/a/6992948/8479 détaille la simple modification de web.config nécessaire pour IIS7 ou supérieur. – Rory

2

Pour répondre à votre dernière question. Ces deux lignes définissent des en-têtes HTTP pour la réponse renvoyée au navigateur. Content-Encoding indique au navigateur que la réponse est encodée en gzip et qu'elle doit être décodée. La dernière ligne ajoute Accept-Encoding au Vary header. Avec cela, le navigateur ou les proxies peuvent déterminer si la réponse était unique ou est influencée par certains autres en-têtes et ajuster leur mise en cache.

3

Dans IIS7, toutes les demandes vont à .net, vous devez donc créer un HttpModule qui a ajouté ces en-têtes à toutes les réponses. Sans IIS7, et sur l'hébergement partagé, vous devez créer un gestionnaire qui mappé une extension de fichier .net que vous n'utilisez pas (comme .asmx) et dans le fichier web.config, spécifiez que les fichiers .asmx vont à votre HttpHandler qui est défini pour réécrire le chemin d'accès à .jpg ou autre chose et définir l'en-tête là aussi.

11

La raison pour laquelle il ne fait que compresser votre fichier ASPX est que le code que vous avez écrit est uniquement incorporé dans le fichier ASPX. Un fichier ASPX est une requête distincte de tout contenu lié qu'il contient. Donc, si vous avez une page ASPX qui contient:

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

Cela équivaudrait à 2 demandes (recherche DNS mis à part) de votre navigateur aux ressources:

  1. pour la page ASPX et
  2. pour l'image contenue par la page aspx.

Chaque demande a sa propre réponse vapeur. Le code que vous avez publié est attaché uniquement au flux de réponse ASPX, c'est pourquoi seule votre page ASPX est compressée.Les lignes 1 & 2 de votre code posté reprennent pour l'essentiel le flux de réponse normal de la page et injectent un code "intermédiaire" qui dans ce cas mange et compresse le flux de sortie normal avec un flux GZip et l'envoie à la place.

Les lignes 3 & 4 configurent les en-têtes de réponse. Toutes les requêtes et réponses http ont des en-têtes qui sont envoyés avant le contenu. Ceux-ci mettent en place la requête/réponse afin que le serveur et le client sachent ce qui est envoyé et comment.

Dans ce cas, la ligne 3 informe le navigateur client que le flux de réponse est compressé via gzip et doit donc être décompressé par le navigateur client avant d'être affiché.

Et la ligne 4 est simplement en train d'activer l'en-tête Accept-Encoding de la réponse. Cela aurait autrement été absent de la réponse.

Vous pouvez écrire/obtenir des modules enfichables qui vous permettent de compresser un multitide d'autres types MIME tels que * .js et * .css, mais il vaut mieux utiliser la fonctionnalité de compression intégrée d'IIS.

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

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

..

Richard

+0

Descriptions vraiment géniales – Rakeshyadvanshi

37

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> 

Crédit: How to GZip on ASP.NET and GoDaddy

+0

Celui-ci fonctionne .. –

+0

besoin de vérifier .... –

+2

la dernière ligne doit être supprimée – JeffT

11

cela peut être utile pour vous l'essayer, ce accepte et dégonfler 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 == 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"); 
     } 
    } 
+1

Merci beaucoup pour ce code. J'avais besoin de gzip/dégonfler le contenu d'un site spécifique Je n'ai pas accès à la console IIS et cela m'a aidé. Juste une question cependant: Ce code semble dégonfler tous les fichiers aspx et gziping CSS et ScriptResources, mais il ne gziping aucun fichier .js. Y a-t-il un moyen de le faire? Merci. –

+0

Ceci est faux, car vous ne gérez pas les instructions de qualité comme ceci: 'gzip; q = 0, deflate'. http://www.singular.co.nz/2008/07/finding-preferred-accept-encoding-header-in-csharp/ – oligofren

0

Ajoutez l'extension .aspx au fichier .css ou .js. Utilisez <% @ Page ContentType = "text/css"%> ou javascript dans le fichier pour le servir avec le type MIME correct. & Utilisez URL Rewrite pour le masquer dans les navigateurs de l'agent utilisateur. L'en-tête de réponse de codage de contenu est ajouté à gzip pour indiquer que gzip est la méthode utilisée pour effectuer la compression. Variez l'en-tête de réponse à Accept-Encoding pour que toutes les caches sachent quelle page (compressée ou non compressée) devrait être servie dépend de l'en-tête Accept-Encoding de la requête. Je l'ai développé à https://stackoverflow.com/a/14509007/1624169

Questions connexes