¿Por qué IIS 7 ignora ciertos tipos MIME (pero no todos) para la compresión? Dando error: DYNAMIC_COMPRESSION_NOT_SUCCESS - Motivo 12

11

Por lo tanto, soy un poco un IIS7 n00b, pero he usado la mayoría de los sistemas IIS antiguos desde 3. Estoy tratando de activar la compresión dinámica y está funcionando, principalmente. No funciona para mis solicitudes de ADO.Net Data Service (Astoria), por lotes o no.

Encontré el seguimiento de solicitud fallida (FREB) que fue realmente útil. Y lo que veo en solicitudes no procesadas es Reason Code 12, NO_MATCHING_CONTENT_TYPE. OK, entonces no tengo especificado el tipo MIME correspondiente, eso es fácil.

Excepto que esto es lo que tengo en mi web.config (que creo que es correcto, pero tal vez no).

<httpCompression dynamicCompressionDisableCpuUsage="100"
                 dynamicCompressionEnableCpuUsage="100"
                 noCompressionForHttp10="false"
                 noCompressionForProxies="false"
                 noCompressionForRange="false"
                 sendCacheHeaders="true"
                 staticCompressionDisableCpuUsage="100"
                 staticCompressionEnableCpuUsage="100">
    <dynamicTypes>
        <clear/>
        <add mimeType="*/*"
             enabled="true" />
    </dynamicTypes>
    <staticTypes>
        <clear/>
        <add mimeType="*/*"
             enabled="true" />
    </staticTypes>
</httpCompression>
<urlCompression doDynamicCompression="true"
                doStaticCompression="true"
                dynamicCompressionBeforeCache="false" />

Ahora creo que esto significa que debería comprimir cualquier solicitud que incluya el encabezado Aceptar: Gzip. Me encantaría saber lo que otros podrían pensar aquí.

Mi rastro de violinista:

GET /SecurityDataService.svc/GetCurrentAccount HTTP/1.1
Accept-Charset: UTF-8
Accept-Language: en-us
dataserviceversion: 1.0;Silverlight
Accept: application/atom+xml,application/xml
maxdataserviceversion: 1.0;Silverlight
Referer: http://sdev03/apptestpage.aspx
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.21022; .NET CLR 3.5.30729; InfoPath.2; .NET CLR 3.0.30729; OfficeLiveConnector.1.4; OfficeLivePatch.1.3)
Host: sdev03
Connection: Keep-Alive
Cookie: .ASPXAUTH=<snip>


HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Type: application/atom+xml;charset=utf-8
Server: Microsoft-IIS/7.0
DataServiceVersion: 1.0;
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
Date: Mon, 22 Mar 2010 22:29:06 GMT
Content-Length: 2726

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
*** <snip> removed ***
Peter Oehlert
fuente
1
UTILICE NOTEPAD para editar applicationHost.config. He perdido varias horas antes de comprender que mis cambios realizados en notepad ++ (¡así como en el editor de Visual Studio 2010!) No son aplicados por IIS. Una forma alternativa de agregar mimeType adicional a la colección dynamicTypes / staticTypes es usar appcmd. "C:\Windows\System32\Inetsrv\Appcmd.exe" set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/javascript',enabled='True']" /commit:apphostY nuevamente: después de realizar estos cambios, los verá solo en el bloc de notas. Notepad ++ (¡así como el editor de Visual Studio 2010!)
Sasha
Alexander, no estoy 100% seguro de entender lo que estás diciendo aquí, pero puedo decir con certeza que modificar la configuración de IIS con cualquier editor de texto funciona bien. Es posible que tenga dificultades con un editor que agrega un marcador de lista de materiales, pero aparte de eso, debería estar bien. En mi caso, no era que no pudiera usar el bloc de notas para editarlo, solo que estaba editando el archivo incorrecto. No todos los cambios de configuración se pueden realizar en web.config, que se encuentra en la raíz web de la aplicación. Algunos deben hacerse contra appHost en la carpeta del sistema.
Peter Oehlert
66
@alexander: Es cierto, el uso de aplicaciones de 32 bits como notepad ++ o visual studio en ventanas de 64 bits hará que WOW64 active la redirección de archivos para la carpeta System32. La edición creará un clon en C: \ WINDOWS \ SysWOW64 solo visible para programas de 32 bits y nunca será utilizado por IIS que es un programa de 64 bits
Fredrik Haglund
El Bloc de notas realmente funciona ... Notepad ++ y Visual Studio se redirigen.
Brian White el
@FredrikHaglund Santo fuma. Sugeriría poner ese comentario en su propia respuesta con alguna explicación ... No tenía idea de que algo así estaría sucediendo, y habría estado persiguiendo mi cola por muchas horas más si no hubiera visto su comentario. (También para Sasha y Brian White, quienes también mencionaron el problema, pero su comentario parece estar más cerca del núcleo del problema.)
Beska

Respuestas:

7

OK, resulta que no puedes configurar esto en web.config, solo en appHost.config. Supuse que los documentos decían appHost.config, pero supuse que era una especificación de un concepto general, no la única ubicación de configuración permitida.

Peter Oehlert
fuente
Correcto. La configuración de system.webServer no permite httpCompression en el nivel del sitio web. Puede configurar lo mismo en la raíz, es decir, en applicationhost.config.
Vivek Kumbhar
hmm .. los documentos SÍ dicen que se puede aplicar a nivel web.config - desplácese hasta la parte inferior: msdn.microsoft.com/en-us/library/ms690689(v=vs.90).aspx y busque "Ubicaciones de configuración" tabla .. ¿Hay algún problema en la documentación?
avs099
@ avs099 No lo sé. Cuando publiqué esto hace 3 años, estoy seguro de que comencé con web.config y publiqué b / c no estaba funcionando. Tal vez la funcionalidad cambió en un parche o los documentos están equivocados. Sería bueno probar para averiguarlo.
Peter Oehlert
1
oh - puede ser que no estaba claro - la forma en que leí la documentación, dice que httpCompression PUEDE usarse en web.config - pero no pude hacerlo funcionar, así que terminé modificando el archivo applicationHost.config también. Para mí eso parece que la documentación es engañosa. Voy a vincular mi respuesta en SO aquí: stackoverflow.com/a/20552186/1246870
avs099
Vea mi respuesta: de forma predeterminada, una instalación de IIS limpia desactiva las web.configanulaciones de la configuración de compresión, por lo que debe modificar el applicationHost.config. Sin embargo, en lugar de cambiar la configuración de compresión allí, solo puede permitir anulaciones y volver a estar en el negocio.
mcw
3

Peter, gracias por la pista: también encontramos esa configuración

<add mimeType="application/atom+xml; charset=utf-8" enabled="true" />

en la <httpCompression>sección de applicationHost.configarreglado esto.

También tuvimos que especificar la codificación debido a un error en el código de compresión:

Hay un error en el código de compresión que no analiza el conjunto de caracteres en el encabezado de respuesta correctamente, por lo que deberá configurar "application / xml; charset = utf-8" en la configuración de compresión dinámica para que funcione.

Aquí está la sección relevante completa

<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" staticCompressionLevel="9" dynamicCompressionLevel="4" />
    <scheme name="deflate" dll="%Windir%\system32\inetsrv\gzip.dll" staticCompressionLevel="9" dynamicCompressionLevel="4" />
    <dynamicTypes>
        <add mimeType="text/*" enabled="true" />
        <add mimeType="message/*" enabled="true" />
        <add mimeType="application/x-javascript" enabled="true" />
        <add mimeType="application/atom+xml; charset=utf-8" enabled="true" />
        <add mimeType="*/*" enabled="false" />
    </dynamicTypes>
    <staticTypes>
        <add mimeType="text/*" enabled="true" />
        <add mimeType="message/*" enabled="true" />
        <add mimeType="application/javascript" enabled="true" />
        <add mimeType="*/*" enabled="false" />
    </staticTypes>
</httpCompression>
Jeff Atwood
fuente
3

Desde una nueva instalación, mi applicationHost.config(in %windir%\system32\inetsrv\config) tenía la siguiente configuración:

<section name="httpCompression" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />

... así como un conjunto predeterminado de tipos MIME para comprimir que, desafortunadamente, no incluye JSON y otros tipos de datos que serían buenos candidatos para la compresión.

Cambiando eso a:

<section name="httpCompression" overrideModeDefault="Allow" />

permite la configuración de la httpCompressionetiqueta debajo de la system.webServeretiqueta en mi web.config.

Confirmé esto configurando la httpCompressionsección de applicationHost.config:

<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
    <dynamicTypes>
        <add mimeType="*/*" enabled="false" />
    </dynamicTypes>
    <staticTypes>
        <add mimeType="*/*" enabled="false" />
    </staticTypes>
</httpCompression>

... y ahora puedo configurar todos los tipos MIME que realmente quiero comprimir en web.config.

mcw
fuente
El seguimiento de la solicitud fallida fue muy útil para mí al solucionar esto: iis.net/learn/troubleshoot/using-failed-request-tracing/…
mcw
Esto no funciona en absoluto para IIS8 +. ¿Tiene alguna experiencia para que el httpCompressionelemento funcione a web.confignivel en versiones más nuevas de IIS o es imposible? Los documentos son una pesadilla: no parece decir cuál es el acuerdo oficial en ninguna parte.
theyetiman
@theyetiman: lo siento, no he trabajado con IIS8 + en absoluto. Buena suerte.
mcw
0

Para agregar los tipos mime faltantes de powershell, use los siguientes comandos:

Add-WebConfiguration -Filter '/system.webServer/httpCompression/staticTypes' -PSPath 'IIS:\' -AtIndex 0 -Value @{mimeType='application/javascript'; enabled='True'}

Add-WebConfiguration -Filter '/system.webServer/httpCompression/staticTypes' -PSPath 'IIS:\' -AtIndex 0 -Value @{mimeType='image/svg+xml'; enabled='True'}

Add-WebConfiguration -Filter '/system.webServer/httpCompression/staticTypes' -PSPath 'IIS:\' -AtIndex 0 -Value @{mimeType='text/css'; enabled='True'}

Tenga en cuenta que el orden de los mimeTypes es importante, ya que IIS parece tomar la primera coincidencia. Esto significa que mimeTypes con comodines (*) debe estar debajo de mimeTypes sin comodines. Por lo tanto, asegúrese de que el mimeType */*esté en la parte inferior, ya que no se utilizará ninguna entrada debajo

Editar:

IIS es una mierda, por lo que la mejor opción es borrar los staticTypes y volver a agregar todo en el orden correcto:

Clear-WebConfiguration -Filter "//system.webServer/httpCompression/staticTypes/add" -PSPath 'IIS:\'

SetCompressionOfMimeType 'text/*' 'True'
SetCompressionOfMimeType 'application/javascript' 'True'
SetCompressionOfMimeType 'image/svg+xml' 'True'
SetCompressionOfMimeType 'text/css' 'True'
SetCompressionOfMimeType '*/*' 'False'


function SetCompressionOfMimeType($mimeType, $enabled){
    Write-Output "Setting compression for $mimeType to $enabled"
    Add-WebConfiguration -Filter '/system.webServer/httpCompression/staticTypes' -PSPath 'IIS:\' -Value @{mimeType=$mimeType; enabled=$enabled}
}
Mario
fuente