2010-01-26 10 views
56

Tengo dificultades para comprimir correctamente un resultado Json de ASP.NET MVC en IIS 7. He habilitado la compresión estática y dinámica en IIS. Puedo verificar con Fiddler que el texto normal/html y los registros similares están comprimidos. Al ver la solicitud, el encabezado gzip de aceptación de codificación está presente. La respuesta tiene el tipo mimet "application/json", pero no está comprimido.Cómo comprimir un resultado Json de ASP.NET MVC con IIS 7.5

He identificado que el problema parece estar relacionado con el MimeType. Cuando incluyo mimeType="*/*", puedo ver que la respuesta está gzip correctamente. ¿Cómo puedo hacer que IIS comprima SIN usar un mimeType comodín? Supongo que este problema tiene algo que ver con la forma en que ASP.NET MVC genera encabezados de tipo de contenido.

El uso de la CPU está muy por debajo del umbral de aceleración dinámica. Cuando examino los registros de seguimiento de IIS, puedo ver que no se comprime debido a que no se encuentra un tipo de mime coincidente.

<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

No puedo usar un tipo de letra comodín porque me encuentro con un problema extraño con IE8 - parece tener dificultades para descargar un archivo .zip cuando la solicitud se descomprime gráficamente por IIS. Firefox 3.5 no se ve afectado. –

Respuesta

57

Asegúrese de que su % windir% \ system32 \ inetsrv \ config \ applicationHost.config Tiene entre otros:

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

Desde el link de @AtanasKorchev.

Como @simon_weaver dijo en los comentarios, es posible que esté editando el archivo incorrecto con un editor de 32 bits en un Windows de 64 bits, use notepad.exe para asegurarse de que este archivo esté efectivamente modificado.

+2

NTOE: si me parece que falta 'applicationHost.config', probablemente esté en una máquina de 64 bits usando un editor de 32 bits.Pruebe el bloc de notas DESPUÉS DE HACER RESPALDO, por supuesto. http://www.west-wind.com/weblog/posts/2008/Aug/09/Editing-Applicationhostconfig-on-64-bit-Win2008 –

+1

Nota para los usuarios de IIS 8: * también funciona para IIS 8 * –

+0

Horas, horas, te digo, pasé HORAS tratando de descubrir por qué mi aplicación gzip/json no salía de mi IIS ... ¡Esto finalmente funcionó! ¡Gracias! –

21

He utilizado correctamente el enfoque resaltado here.

+9

Había visto ese artículo antes, pero lo descarté porque no añadía nada nuevo o útil. Bueno, parece que, a diferencia de otros tipos de mime, debe especificar la codificación de contenido para IIS 7 para comprimir las respuestas de aplicación/json de ASP.NET MVC. Decir 'application/json' no es suficiente; necesita ser 'application/json; charset = utf-8'. –

+0

Ese me mordió también :) –

+0

NTOE: si me parece que falta 'applicationHost.config', probablemente estés en una máquina de 64 bits usando un editor de 32 bits. Pruebe el bloc de notas DESPUÉS DE HACER RESPALDO, por supuesto. http://www.west-wind.com/weblog/posts/2008/Aug/09/Editing-Applicationhostconfig-on-64-bit-Win2008 –

5

Recomiendo this approach
Crear CompressAttribute clase, y establecer la acción de destino.

+1

¿Solo cuando todo lo demás falla? ¿No debería IIS7 + hacer un mejor trabajo? –

+0

Esta es una buena solución porque puede almacenar en caché y comprimir mientras que IIS solo almacenará en caché o comprimir –

+0

Este es también un buen enfoque en que la compresión de mensajes pequeños puede costar más en comprimir/descomprimir que lo que tendrían en la transmisión de los datos. Establecer gzip para todas las descargas de JSON en una aplicación en realidad puede costarle tiempo a estos mensajes más pequeños, por lo que decorar solo grandes (r) descargas tiene sus ventajas. –

14

Use this guide

Ninguna de estas respuestas trabajó para mí. Tomé nota de la aplicación /json; charset = utf-8 mime-type embargo.

+1

+1: esto funcionó para mí, utilizando 'application/json; charset = utf-8' mime-type: o) – Andrew

+0

esto funciona para mí además de que necesita recordar reiniciar el servidor no solo el sitio web. es decir, después de iniciar 'inetmgr', haga clic en el nombre de su servidor y diríjase directamente a la sección' Administrar servidor': use ese reinicio y no el reinicio individual del sitio web. – wal

Cuestiones relacionadas