Por que o IIS 7 está ignorando determinados tipos MIME (mas não todos) para compactação? Erro: DYNAMIC_COMPRESSION_NOT_SUCCESS - Motivo 12

11

Então, eu sou um pouco do n00b do IIS7, mas eu usei a maioria dos antigos sistemas IIS voltando para o 3. Estou tentando ativar a compactação dinâmica e ela está funcionando, principalmente. Ele não funciona para minhas solicitações do Serviço de Dados ADO.Net (Astoria), em lote ou não.

Encontrei a solicitação com falha (FREB) rastreamento que foi realmente útil. E o que vejo nas solicitações não relacionadas é Reason Code 12, NO_MATCHING_CONTENT_TYPE . OK, então eu não tenho o tipo MIME correspondente especificado, isso é fácil.

Só que isso é o que eu tenho no meu web.config (que eu acho correto, mas talvez não).

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

Agora, acho que isso significa que deve compactar qualquer solicitação que inclua o cabeçalho Accept: Gzip. Eu adoraria saber o que os outros podem pensar aqui.

Meu traço 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 ***
    
por Peter Oehlert 22.03.2010 / 23:42

4 respostas

6

OK, você não pode configurar isso no web.config, apenas no appHost.config. Eu supus que os docs dissessem appHost.config, mas eu tinha assumido que era uma especificação de um conceito geral, não o único local de configuração permitido.

    
por 23.03.2010 / 00:22
3

A partir de uma nova instalação, meu applicationHost.config (em %windir%\system32\inetsrv\config ) teve a seguinte configuração:

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

... bem como um conjunto padrão de tipos MIME para comprimir isso, infelizmente, não inclui JSON e outros tipos de dados que seriam bons candidatos a compactação.

Mudando para:

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

ativa a configuração da tag httpCompression na tag system.webServer em web.config .

Confirmei isso definindo a seção httpCompression do applicationHost.config para:

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

... e agora posso definir todos os tipos MIME que eu realmente quero compactar no web.config .

    
por 13.10.2014 / 20:00
2

Peter, obrigado pela dica - também descobrimos que a configuração

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

na seção <httpCompression> de applicationHost.config corrigiu isso.

Também precisávamos especificar a codificação devido a um erro no código de compactação:

There is a bug in the compression code that it does not parse the charset in the response header correctly, so you will have to configure "application/xml; charset=utf-8" in the dynamic compression settings to have it work.

Aqui está a seção relevante na íntegra

<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>
    
por 28.04.2010 / 01:41
0

Para adicionar mimetypes ausentes do powershell, use os seguintes 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'}

Observe que a ordem dos mimeTypes é importante, pois o IIS parece receber a primeira correspondência. Isso significa que os mimeTypes com curingas (*) devem estar abaixo de mimeTypes sem curingas. Portanto, certifique-se de que o mimeType */* esteja na parte inferior, pois qualquer entrada abaixo dele não será usada

Editar:

IIS é uma porcaria, então a melhor opção é apenas limpar os staticTypes e adicionar tudo de volta na ordem correta:

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}
}
    
por 28.10.2015 / 10:37