Comment implémenter la compression GZip dans ASP.NET?

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ée depuis 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 ne fait que compresser mon code de page .aspx (balisage) et non les fichiers CSS et JS inclus en tant que fichiers externes. S’il vous plaît 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 access aux configurations du serveur IIS). Et aussi dans le code ci-dessus, je ne reçois pas les deux dernières lignes, pourquoi elles sont utilisées et quel est le but de ces lignes. S’il vous plaît, expliquez!

Merci

Pour compresser les fichiers JS et CSS, vous devez gérer cela au niveau IIS, car ces fichiers sont rendus directement sans l’exécution ASP.NET.

Vous pouvez faire un mappage d’extension JSX & CSSX dans IIS sur aspnet_isapi.dll, puis tirer parti de votre code postal, mais IIS est susceptible de faire un meilleur travail pour vous.

L’en-tête content-encoding 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 est préférable de le dire.

Le paramètre de cache Accept-encoding est là pour qu’une version mise en cache du contenu compressé ne soit pas envoyée à un navigateur qui n’a demandé que text / html.

Voici la solution pour les fichiers css et javascript

                  

Crédit: Comment GZip sur ASP.NET et GoDaddy

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:

 example 

Cela équivaudrait à 2 demandes (recherches DNS de côté) depuis votre navigateur vers les ressources:

  1. pour la page aspx et
  2. pour l’image contenue dans la page aspx.

Chaque demande a sa propre réponse à la vapeur. Le code que vous avez publié est associé au stream de réponses ASPX uniquement, ce qui explique pourquoi seule votre page ASPX est compressée. Les lignes 1 et 2 de votre code posté reprennent essentiellement le stream de réponse normal de la page et injectent un code “intermédiaire” qui dans ce cas mange et compresse le stream de sortie normal avec un stream GZip et l’envoie à la place.

Les lignes 3 et 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. Celles-ci configurent 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 stream 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 allume simplement l’en-tête Accept-Encoding de la réponse. Cela aurait autrement été absent de la réponse.

Il existe des modules enfichables que vous pouvez écrire / obtenir pour vous permettre de compresser un multitide d’autres types MIME tels que * .js et * .css, mais il est préférable d’utiliser la fonctionnalité de compression intégrée d’IIS.

Vous n’avez pas dit quelle version de IIS vous utilisiez, mais s’il s’agissait d’IIS 7.0, il vous faudrait inclure ce qui suit dans la section de votre fichier web.config:

        

..

Richard

Cela peut être utile pour l’essayer, cela accepte les compressions déflates et gzip.

  void Application_PreRequestHandlerExecute(object sender, EventArgs e) { HttpApplication app = sender as HttpApplication; ssortingng 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"); } } 

Dans IIS7, toutes les requêtes vont à .net, vous devez donc créer un HttpModule qui ajoute ces en-têtes à toutes les réponses.

Sans IIS7, et sur l’hébergement mutualisé, vous devriez créer un gestionnaire qui mappe une extension de fichier .net que vous n’utilisez pas (comme pour réécrire le chemin d’access à .jpg ou autre et y placer l’en-tête.

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

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. & utiliser URL Rewrite pour masquer cela dans les navigateurs de l’agent utilisateur. L’en-tête de réponse encodage de contenu est ajouté à gzip pour indiquer que gzip est la méthode utilisée pour effectuer la compression. La valeur de l’en-tête de réponse variable est Accept-Encoding, donc tous les caches savent quelle page (compressée ou non compressée) doit être servie en fonction de l’en-tête Accept-Encoding de la requête. J’ai développé ceci à https://stackoverflow.com/a/14509007/1624169

Vous pouvez simplement append ce qui suit à votre fichier web.config dans l’élément :

  

REMARQUE: Si vous utilisez une version antérieure d’IIS (inférieure à la version 7.5), vous souhaiterez peut-être définir doDynamicCompression sur false car le processus consum beaucoup de ressources processeur. Ces problèmes ont été résolus dans IIS 7.5.

Référence: https://docs.microsoft.com/en-us/iis/configuration/system.webserver/urlcompression