Comment activer la compression gzip lors de l'utilisation de MVC3 sur IIS7?

100

Est-ce que quelqu'un sait comment activer la compression gzip dans MVC 3? J'utilise IIS7.

Résultat de l'audit Google Chrome:

  1. Activer la compression gzip (4)
  2. La compression des ressources suivantes avec gzip pourrait réduire leur taille de transfert d'environ deux tiers (~ 92,23 Ko):
  3. / mydomain / pourrait économiser ~ 1,53 Ko
  4. jquery-1.4.4.min.js pourrait économiser ~ 51,35 Ko
  5. Cufon.js pourrait économiser ~ 11,89 Ko
  6. Futura.js pourrait économiser ~ 27,46 Ko
imarkic84
la source
Pas tranquille un doublon: stackoverflow.com/q/552317/712526
jpaugh

Réponses:

143

Vous pouvez configurer la compression via votre web.configfichier comme suit:

<system.webServer>
    <urlCompression doStaticCompression="true" doDynamicCompression="true" />
</system.webServer>

Vous pouvez trouver la documentation de cet élément de configuration sur iis.net/ConfigReference . C'est l'équivalent de:

  1. Ouverture des services Internet (IIS Manager)
  2. Naviguer dans l'arborescence sur la gauche jusqu'à atteindre le répertoire virtuel que vous souhaitez modifier
  3. Sélection du répertoire virtuel approprié pour que le titre du volet de droite devienne le nom dudit répertoire virtuel.
  4. Choisir "Compression" sous "IIS" dans le volet de droite
  5. Cochez les deux options et choisissez «Appliquer» sous «Actions» à l'extrême droite.

Remarque: (comme indiqué dans les commentaires) Vous devez vous assurer que Http Dynamic Compression est installé, sinon le réglage doDynamicCompression="true"n'aura aucun effet. Le moyen le plus rapide de procéder est:

  1. Démarrer> Tapez optionalfeatures(c'est le moyen le plus rapide d'accéder à la fenêtre «Activer ou désactiver les fonctionnalités Windows»)
  2. Accédez à Internet Information Services> Services World Wide Web> Fonctionnalités de performances dans l'arborescence "Fonctionnalités Windows"
  3. Assurez-vous que "Compression de contenu dynamique" est coché
  4. Cliquez sur "OK" et attendez que Windows installe le composant
Rob
la source
11
Il est à noter que vous devez avoir l'option Http Compression Dynamic IIS installée pour que cela fonctionne. Le lien de référence de configuration dans cette réponse contient les détails.
Caleb Vear
16
Sur Windows Server 2008 optionalfeaturesne fonctionnait pas pour moi. Au lieu de cela, accédez à Gestionnaire de serveur> Rôles> Faites défiler jusqu'au serveur Web (IIS)> cliquez sur Ajouter des services de rôle. Assurez-vous maintenant que Web Server> Performance> Static Content Compression et Dynamic Content Compression sont installés.
Rory
1
Sachez que cela peut gâcher votre en-tête d'hôte "Vary:". Plus d'infos: stackoverflow.com/questions/5372052/…
jjxtra
2
Au moins dans mon expérience, cela compresse tout MAIS la sortie des contrôleurs MVC. Pour une raison quelconque, ils renvoient du HTML sans aucune compression gzip.
Chris Moschini
1
Mise en garde !!! La compression dynamique IIS supprime les en-têtes Vary, c'est un bogue ou une fonctionnalité, je ne sais pas, mais l'implémentation d'un filtre personnalisé a plus de sens si vous voulez que le cache fonctionne correctement.
Akash Kava du
31

Vous pouvez le faire dans le code si vous préférez le faire. Je créerais un contrôleur de base dont chaque contrôle hérite et le décorerais avec cet attribut ci-dessous.

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);
        }
    }
}
NetProvoke
la source
2
@JustAnotherUserYouMayKnow - dépend de la façon dont vous servez vos ressources; si vous pointez directement sur des fichiers sur le serveur, non, mais si vous les servez via des actions (comme notre système de gestion des ressources nous le permet), cela fonctionne à merveille. BTW Rick Strahl a mis à jour ceci pour prendre en charge la vérification que le client prend
Paul Carroll
4
Notez que pour la redirection, il est important de se protéger contre la filternullité. J'ai utilisé var response = ...;if( response == null || response.Filter == null)return;.
Travis J
2
En outre, vous voudrez peut-être utiliser d' gzipabord au lieu de deflate, en savoir plus ici: stackoverflow.com/a/9856879/1026459
Travis J
IIS met en cache les fichiers compressés, il n'aura donc pas à les compresser à nouveau pour de meilleures performances. Utilisez IIS si vous pouvez et utilisez cette approche uniquement si la compression IIS n'est pas disponible.
Muhammad Rehan Saeed
1
Aucune de ces solutions ne fonctionne sur MVC5, IIS 8.5, .Net 4.5 Localhost. Que dois-je faire, des suggestions?
aadi1295 le
12

La compression est activée / désactivée au niveau du serveur. Voir module de compression IIS dans la console de gestion iis.

Voici les instructions pour IIS à partir du site Microsoft.

nakhli
la source
1
Vous pouvez également le définir dans le web.config
Jack Marchetti