2010-09-27 4 views
35

comment compresser l'envoi de sortie par une application de mvc d'asp.net ??comment gzip contenu dans asp.net MVC?

+0

Pourquoi ne pas simplement mettre le '' 'ou même ' 'dans web.comfig' http://www.iis.net/configreference/system.webserver/httpcompression http://stackoverflow.com/questions/9235337/gzipping-content-files-in-asp-net-mvc-3? – Kuncevic

Répondre

83

Voici ce que je l'utilise (comme de ce monent dans le temps):

using System.IO.Compression; 

public class CompressAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 

     var encodingsAccepted = filterContext.HttpContext.Request.Headers["Accept-Encoding"]; 
     if (string.IsNullOrEmpty(encodingsAccepted)) return; 

     encodingsAccepted = encodingsAccepted.ToLowerInvariant(); 
     var response = filterContext.HttpContext.Response; 

     if (encodingsAccepted.Contains("deflate")) 
     { 
      response.AppendHeader("Content-encoding", "deflate"); 
      response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress); 
     } 
     else if (encodingsAccepted.Contains("gzip")) 
     { 
      response.AppendHeader("Content-encoding", "gzip"); 
      response.Filter = new GZipStream(response.Filter, CompressionMode.Compress); 
     } 
    } 
} 

utilisation dans le contrôleur:

[Compress] 
public class BookingController : BaseController 
{...} 

Il existe d'autres variables, mais cela fonctionne plutôt bien. (BTW, j'utiliser le [Compresser] attribut sur mon BaseController pour sauver les doubles emplois dans le projet, alors que ce qui précède fait sur un contrôleur en fonction du contrôleur.

[Modifier] comme mentionné dans le paragraphe ci-dessus. À simplifier l'utilisation, vous pouvez également inclure [Compress] OneShot dans le BaseController lui-même, ce qui, chaque contrôleur de l'enfant hérité accède à la fonctionnalité par défaut:.

[Compress] 
public class BaseController : Controller 
{...} 
+0

même concept :) code presque identique – veggerby

+0

effectivement, regardé votre exemple - très similaire en effet - spooky :). J'ai utilisé ce code pendant plus d'un an, donc je peux vérifier que cela fonctionne très bien ... –

+0

est possible que je peux faire quelques réglages dans web.config pour faire la compression. encore une chose que je veux savoir, comment vérifier combien de frais généraux est ajouté au serveur par le code de compression que nous courons ici. –

5

Jetez un oeil à cet article qui décrit une méthode utilisant des filtres astucieux d'action

http://weblogs.asp.net/rashid/archive/2008/03/28/asp-net-mvc-action-filter-caching-and-compression.aspx

PAR EXEMPLE

[CompressFilter] 
public void Category(string name, int? page) 

Et comme un bonus supplémentaire, il comprend également un CacheFilter

+0

okie, en testant cela, encore une chose que je veux savoir, comment puis-je vérifier si les données iam obtenir du serveur est gzippé ou non ?? –

+0

Utilisez Firebug comme dans l'article et regardez l'en-tête de réponse – veggerby

+1

Ne fonctionne pas sur MVC5, IIS 8.5 et .Net 4.5, toute aide sera appréciée. –

Questions connexes