2012-07-23 22 views
21

Por lo tanto, estoy intentando que mi aplicación envíe sus respuestas JSON mediante compresión dinámica y gzip. Lamentablemente esto no está funcionando. Toda la compresión estática en el servidor funciona bien, pero no es dinámica.Configurar IIS 7.5 para enviar respuestas JSON gzipped, NO_MATCHING_CONTENT_TYPE

he establecido esto, añadiendo:

<add mimeType="application/json" enabled="true" /> 
<add mimeType="application/json; charset=utf-8" enabled="true" /> 

Para la sección de <dynamicTypes><httpCompression> en el archivo applicationHost.config. Estoy usando Charles para inspeccionar las solicitudes HTTP y puedo verificar que estoy enviando las solicitudes con el conjunto de encabezado Accept-Encoding: gzip, deflate. Lo he intentado con Accept: */* y Accept: application/json. Cuando no funcionaba habilité el registro de rastreo de "Solicitud fallida" para encontrar el código de error para DYNAMIC_COMPRESSION_NOT_SUCCESS, que era NO_MATCHING_CONTENT_TYPE.

He estado intentando investigar en foros y Google, pero todo lo que puedo ver es que la gente dice que usar el mimeType con el juego de caracteres especificado soluciona el problema, pero en mi caso todavía no funciona y puedo verificar que la respuesta vuelve con un encabezado que dice Content-Type: application/json; charset=utf-8

los criterios de valoración que sirven las respuestas JSON son servicios web estándar .NET ASMX con anotada [ScriptService()] en la clase y [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] en el método. Devuelven JSON bien, pero no puedo hacer que la compresión dinámica funcione por mi propia vida.

ya que estos son métodos web normales, así También he añadido:

<add mimeType="text/xml" enabled="true" /> 
<add mimeType="text/xml; charset=utf-8" enabled="true" /> 

para tratar de gzip las respuestas XML. Lo que es frustrante es que esta compresión funciona mientras que enviar JSON desde el mismo método no funciona. En este punto, estoy perdido.

Respuesta

33

Desea asegurarse de que el tipo de mime */* es posterior a los tipos que agrega. También asegúrese de haber instalado Dynamic Compression Module usando Server Manager (u OptionalFeatures.exe)

Estas son las líneas de comando que uso para asegurarme de que se realiza una buena compresión. (Pero asegúrese de que los módulos dinámicos y compresión estática en realidad han instalado):

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/serverRuntime /frequentHitThreshold:"1" 
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/urlCompression /doDynamicCompression:"True" 

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"dynamicTypes.[mimeType='application/json']" 
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/json',enabled='True']" 

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"dynamicTypes.[mimeType='application/json; charset=utf-8']" 
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/json; charset=utf-8',enabled='True']" 

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"dynamicTypes.[mimeType='application/javascript']" 
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/javascript',enabled='True']" 

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"dynamicTypes.[mimeType='application/x-javascript']" 
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/x-javascript',enabled='True']" 

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"dynamicTypes.[mimeType='application/x-javascript; charset=utf-8']" 
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/x-javascript; charset=utf-8',enabled='True']" 

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"dynamicTypes.[mimeType='*/*']" 
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='*/*',enabled='False']" 

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"staticTypes.[mimeType='application/javascript']" 
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"staticTypes.[mimeType='application/javascript',enabled='True']" 

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"staticTypes.[mimeType='application/x-javascript']" 
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"staticTypes.[mimeType='application/x-javascript',enabled='True']" 

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"staticTypes.[mimeType='application/x-javascript; charset=utf-8']" 
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"staticTypes.[mimeType='application/x-javascript; charset=utf-8',enabled='True']" 

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"staticTypes.[mimeType='*/*']" 
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"staticTypes.[mimeType='*/*',enabled='False']" 

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /noCompressionForHttp10:"False" /noCompressionForProxies:"False" /minFileSizeForComp:"2700" 

Después de ejecutar esta carpeta% windir% \ system32 \ inetsrv \ config \ ApplicationHost.config debería ser algo como (tenga en cuenta que / es en la parte inferior):

<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files" minFileSizeForComp="2700" noCompressionForHttp10="false" 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/json" enabled="true" /> 
     <add mimeType="application/json; charset=utf-8" enabled="true" /> 
     <add mimeType="application/javascript" enabled="true" /> 
     <add mimeType="application/x-javascript" enabled="true" /> 
     <add mimeType="application/x-javascript; charset=utf-8" enabled="true" /> 
     <add mimeType="*/*" enabled="false" /> 
    </dynamicTypes> 
    <staticTypes> 
     <add mimeType="text/*" enabled="true" /> 
     <add mimeType="message/*" enabled="true" /> 
     <add mimeType="application/atom+xml" enabled="true" /> 
     <add mimeType="application/xaml+xml" enabled="true" /> 
     <add mimeType="application/javascript" enabled="true" /> 
     <add mimeType="application/x-javascript" enabled="true" /> 
     <add mimeType="application/x-javascript; charset=utf-8" enabled="true" /> 
     <add mimeType="*/*" enabled="false" /> 
    </staticTypes> 
</httpCompression> 
+0

Gracias, en realidad lo resolví hace algún tiempo por mi cuenta pero no recuerdo cómo lo hice y desde entonces he abandonado la empresa en la que estaba. Ahora sí creo que estaba usando un script con esos comandos e integrándolo en la definición de MSBuild para la implementación de la aplicación. – Sloloem

+2

Pasé todo el día buscando en Google por qué la compresión no funcionaba para mí. Por alguna razón, solo al ejecutar tu script resolví mi problema (configurarlo directamente en el archivo apphost no). ¡Gracias! – LazyBoy

+0

¿Por qué tiene los mismos tipos MIME en las secciones estáticas y dinámicas? –

Cuestiones relacionadas