2010-01-26 4 views
56

Ho difficoltà a rendere IIS 7 comprimere correttamente un risultato Json da ASP.NET MVC. Ho abilitato la compressione statica e dinamica in IIS. Posso verificare con Fiddler che i normali documenti di testo/html e simili sono compressi. Visualizzazione della richiesta, è presente l'intestazione gzip accept-encoding. La risposta ha il mimetype "application/json", ma non è compressa.Come comprimere un risultato Json da ASP.NET MVC con IIS 7.5

Ho identificato che il problema sembra riguardare il MimeType. Quando includo lo mimeType="*/*", posso vedere che la risposta è stata correttamente compressa con gzip. Come posso comprimere IIS SENZA usare un mimeType con caratteri jolly? Presumo che questo problema abbia a che fare con il modo in cui ASP.NET MVC genera intestazioni di tipo di contenuto.

L'utilizzo della CPU è ben al di sotto della soglia di limitazione dinamica. Quando esamino i log di traccia da IIS, posso vedere che non riesce a comprimere a causa di non trovare un tipo mime corrispondente.

<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

Non riesco a utilizzare un mimetype con caratteri jolly poiché sto riscontrando uno strano problema con IE8: sembra che abbia difficoltà a scaricare un file .zip quando la richiesta è ulteriormente compressa da IIS. Firefox 3.5 non è interessato. –

risposta

57

Assicurarsi che il % windir% \ system32 \ inetsrv \ config \ applicationHost.config contiene questi:

<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> 

Dal link di @AtanasKorchev.

Come ha detto @simon_weaver nei commenti, è possibile che si stia modificando il file sbagliato con un editor a 32 bit su Windows a 64 bit, utilizzare notepad.exe per assicurarsi che questo file sia effettivamente modificato.

+2

NTOE: se 'applicationHost.config' mi sembra mancante, probabilmente stai usando una macchina a 64 bit usando un editor a 32 bit.Prova il blocco note DOPO EFFETTUARE IL BACKUP naturalmente. http://www.west-wind.com/weblog/posts/2008/Aug/09/Editing-Applicationhostconfig-on-64- bit-Win2008 –

+1

Nota per gli utenti di IIS 8: * Funziona anche con IIS 8 * –

+0

Ore, ore che ti dico, ho speso ORE cercando di scoprire perché la mia applicazione gzip/json non uscisse dal mio IIS ... Alla fine ha funzionato! Grazie! –

21

Ho utilizzato con successo l'approccio evidenziato here.

+9

Avevo già visto quell'articolo, ma l'ho respinto perché non aggiungevo nulla di nuovo o utile. Bene, a differenza di altri tipi di mime, è necessario specificare la codifica del contenuto per IIS 7 per comprimere le risposte application/json da ASP.NET MVC. Dire "applicazione/json" non è abbastanza; deve essere 'application/json; charset = utf-8'. –

+0

Anche questo un po ':) –

+0

NTOE: se 'applicationHost.config' mi sembra mancante, probabilmente stai usando una macchina a 64 bit usando un editor a 32 bit. Prova il blocco note DOPO EFFETTUARE IL BACKUP naturalmente. http://www.west-wind.com/weblog/posts/2008/Aug/09/Editing-Applicationhostconfig-on-64- bit-Win2008 –

5

Suggerisco this approach
Creare classe CompressAttribute e impostare l'azione di destinazione.

+1

Solo quando tutto il resto fallisce? non dovrebbe IIS7 + fare un lavoro migliore? –

+0

Questa è una buona soluzione perché è possibile eseguire il cache e comprimere mentre IIS eseguirà solo la cache o comprime –

+0

Questo è anche un buon approccio in quanto la compressione di piccoli messaggi può costare di più in compressione/decompressione che avrebbero nella trasmissione vaniglia dei dati. L'impostazione di gzip per tutti i download JSON in un'applicazione può effettivamente costare il tempo per questi messaggi più piccoli, quindi decorare solo grandi (r) download ha i suoi vantaggi. –

14

Use this guide

Nessuna di queste risposte ha lavorato per me. Ho preso nota dell'applicazione /json; charset = utf-8 mime-type però.

+1

+1: questo ha funzionato per me, usando l'applicazione/json; charset = utf-8' mime-type: o) – Andrew

+0

questo funziona per me più è necessario ricordare di riavviare il SERVER non solo il sito web. cioè dopo aver avviato 'inetmgr' fai clic sul nome del tuo server e vai direttamente alla sezione' Gestisci server' - usa quel riavvio e non il riavvio del sito web individuale – wal