2010-01-26 1 views
56

J'ai du mal à faire en sorte que IIS 7 compresse correctement un résultat JSON d'ASP.NET MVC. J'ai activé la compression statique et dynamique dans IIS. Je peux vérifier avec Fiddler que le texte normal/html et les dossiers semblables sont compressés. En regardant la requête, l'en-tête gzip accept-encoding est présent. La réponse a le type mime "application/json", mais n'est pas compressé.Comment compresser un résultat JSON à partir d'ASP.NET MVC avec IIS 7.5

J'ai identifié que le problème semble être lié au MimeType. Quand j'inclus mimeType="*/*", je peux voir que la réponse est gzippée correctement. Comment puis-je obtenir IIS pour compresser sans utiliser un caractère générique mimeType? Je suppose que ce problème a quelque chose à voir avec la façon dont ASP.NET MVC génère des en-têtes de type de contenu.

L'utilisation du processeur est bien inférieure au seuil de limitation dynamique. Lorsque j'examine les journaux de trace d'IIS, je peux voir qu'il ne parvient pas à compresser en raison de ne pas trouver un type mime correspondant.

<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files" noCompressionForProxies="false"> 
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" /> 
    <dynamicTypes> 
     <add mimeType="text/*" enabled="true" /> 
     <add mimeType="message/*" enabled="true" /> 
     <add mimeType="application/x-javascript" enabled="true" /> 
     <add mimeType="application/json" enabled="true" /> 
    </dynamicTypes> 
    <staticTypes> 
     <add mimeType="text/*" enabled="true" /> 
     <add mimeType="message/*" enabled="true" /> 
     <add mimeType="application/x-javascript" enabled="true" /> 
     <add mimeType="application/atom+xml" enabled="true" /> 
     <add mimeType="application/xaml+xml" enabled="true" /> 
     <add mimeType="application/json" enabled="true" /> 
    </staticTypes> 
</httpCompression> 
+1

Je ne peux pas utiliser un type mIME générique car je rencontre un problème étrange avec IE8 - il semble avoir du mal à télécharger un fichier .zip lorsque la requête est gzippée par IIS. Firefox 3.5 n'est pas affecté. –

Répondre

57

Assurez-vous que votre % windir% \ System32 \ inetsrv \ config \ applicationHost.config contient ces:

<system.webServer> 
    <urlCompression doDynamicCompression="true" /> 
    <httpCompression> 
     <dynamicTypes> 
     <add mimeType="application/json" enabled="true" /> 
     <add mimeType="application/json; charset=utf-8" enabled="true" />  
     </dynamicTypes> 
    </httpCompression> 
</system.webServer> 

De l'link de @AtanasKorchev. Comme @simon_weaver l'a dit dans les commentaires, vous pouvez éditer le mauvais fichier avec un éditeur 32 bits sur un Windows 64 bits, utilisez notepad.exe pour vous assurer que ce fichier est effectivement modifié.

+2

NTOE: si 'applicationHost.config' me semble manquer, vous êtes probablement sur une machine 64 bits utilisant un éditeur 32 bits.Essayez le bloc-notes APRÈS FAIRE LA SAUVEGARDE bien sûr. http://www.west-wind.com/weblog/posts/2008/Aug/09/Editing-Applicationhostconfig-on-64-bit-Win2008 –

+1

Remarque pour les utilisateurs d'IIS 8: * cela fonctionne également pour IIS 8 * –

+0

Des heures, des heures je vous dis, j'ai passé des heures à essayer de découvrir pourquoi mon application gzippée/json ne sortait pas de mon IIS ... Cela a finalement fonctionné! Merci! –

21

J'ai utilisé avec succès l'approche surlignée here.

+9

J'avais déjà lu cet article, mais je l'ai rejeté en disant que je n'avais rien ajouté de nouveau ou d'utile. Bien, il semble que, contrairement aux autres types MIME, vous devez spécifier le codage de contenu pour IIS 7 pour compresser les réponses application/json à partir de ASP.NET MVC. Dire 'application/json' n'est pas suffisant; il doit être 'application/json; jeu de caractères = utf-8'. –

+0

Ça m'a un peu plu :) –

+0

NTOE: si 'applicationHost.config' me semble manquer, vous êtes probablement sur une machine 64 bits utilisant un éditeur 32 bits. Essayez le bloc-notes APRÈS FAIRE LA SAUVEGARDE bien sûr. http://www.west-wind.com/weblog/posts/2008/Aug/09/Editing-Applicationhostconfig-on-64-bit-Win2008 –

5

Je recommande this approach
Créez CompressAttribute classe et définissez l'action cible.

+1

Seulement quand tout le reste échoue? IIS7 + ne devrait-il pas faire un meilleur travail? –

+0

Ceci est une bonne solution parce que vous pouvez mettre en cache et compresser alors que IIS va seulement mettre en cache ou compresser –

+0

C'est aussi une bonne approche dans la mesure où la compression des petits messages peut coûter plus cher en compression/décompression que dans la transmission des données. Configurer gzip pour tous les téléchargements JSON dans une application peut en fait vous coûter du temps pour ces petits messages, donc décorer uniquement les gros téléchargements a des avantages. –

14

Use this guide

Aucune de ces réponses a fonctionné pour moi. J'ai pris note de l'application /json; charset = utf-8 mime-type bien.

+1

+1: cela a fonctionné pour moi, en utilisant le 'application/json; charset = utf-8' mime-type: o) – Andrew

+0

cela fonctionne pour moi, plus vous devez vous rappeler de redémarrer le SERVEUR, pas seulement le site Web. c'est-à-dire après avoir lancé 'inetmgr', cliquez sur le nom de votre serveur et allez directement dans la section' Manage Server' - utilisez ce redémarrage et non le redémarrage individuel du site – wal

Questions connexes