Por que o IIS 7 está ignorando certos tipos MIME (mas não todos) para compactação? Dando erro: DYNAMIC_COMPRESSION_NOT_SUCCESS - Razão 12

11

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

Encontrei o rastreamento de solicitação com falha (FREB) que foi realmente útil. E o que eu vejo nos pedidos não corrigidos é Reason Code 12, NO_MATCHING_CONTENT_TYPE. OK, então não tenho o tipo MIME correspondente especificado, é fácil.

Exceto que é isso que tenho no meu web.config (que 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 ele deve compactar qualquer solicitação que inclua o cabeçalho Accept: Gzip. Eu adoraria saber o que os outros podem pensar aqui.

Meu 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
fonte
1
USE O NOTEPAD para editar applicationHost.config. Perdi várias horas antes de entender que minhas alterações feitas no bloco de notas ++ (assim como no editor do Visual Studio 2010 !!) não são aplicadas pelo IIS. Uma maneira alternativa de adicionar mimeType adicional à coleção dynamicTypes / staticTypes é usar appcmd. "C:\Windows\System32\Inetsrv\Appcmd.exe" set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/javascript',enabled='True']" /commit:apphostE novamente: após essas alterações, você as verá apenas no bloco de notas. Notepad ++ (assim como o editor do Visual Studio 2010 !!)
Sasha
Alexander, não tenho 100% de certeza de que entendi o que você está dizendo aqui, mas posso afirmar com certeza que a modificação da configuração do IIS com qualquer editor de texto funciona perfeitamente. Você pode ter dificuldade com um editor que adiciona um marcador de BOM, mas, além disso, ele deve ficar bem. No meu caso, não era que eu não pudesse usar o bloco de notas para editá-lo, apenas porque estava editando o arquivo errado. Nem todas as alterações na configuração podem ser feitas no web.config, que está na raiz do aplicativo. Alguns devem ser feitos no appHost na pasta System.
Peter Oehlert
6
@alexander: É verdade que o uso de aplicativos de 32 bits como o notepad ++ ou o visual studio em janelas de 64 bits fará com que o WOW64 ative o redirecionamento de arquivos da pasta System32. Editando irá criar um clone em C: \ programas visíveis apenas para 32-bit Windows \ Syswow64 e isso nunca vai ser usado pelo IIS que é um programa de 64 bits
Fredrik Haglund
O bloco de notas realmente funciona ... O Notepad ++ e o Visual Studio são redirecionados.
Brian White
@FredrikHaglund Holy fuma. Eu sugeriria colocar esse comentário em sua própria resposta com alguma explicação ... Eu não tinha ideia de que algo assim estaria acontecendo, e estaria me perseguindo por muitas horas se eu não tivesse visto seu comentário. (Props também para Sasha e Brian White, que também mencionou a questão, mas o seu comentário parece ficar mais próximo ao coração do problema.)
Beska

Respostas:

7

OK, acontece que você não pode configurar isso no web.config, apenas no appHost.config. Supunha que os documentos dissessem appHost.config, mas supus que fosse uma especificação de um conceito geral, não o único local de configuração permitido.

Peter Oehlert
fonte
Corrigir. A configuração system.webServer não permite httpCompression no nível do site. Você pode configurar o mesmo na raiz, ou seja, no applicationhost.config.
Vivek Kumbhar 22/03
hmm .. docs dizem que pode ser aplicado no nível web.config - role para baixo: msdn.microsoft.com/en-us/library/ms690689(v=vs.90).aspx e consulte "Locais de configuração" tabela .. Há algum problema na documentação?
avs099
@ avs099 não sei. Quando publiquei isso há 3 anos, tenho certeza de que comecei com o web.config e publiquei b / c que não estava funcionando. Talvez a funcionalidade tenha sido alterada em um patch ou os documentos estejam incorretos. Seria bom testar para descobrir.
Peter Oehlert
1
oh - pode ser que eu não estava claro - da maneira como leio a documentação, ele diz que httpCompression PODE ser usado no web.config - mas como não consegui fazê-lo funcionar, acabei modificando o arquivo applicationHost.config também. Para mim, isso parece documentação é enganosa. Vou vincular minha resposta no SO aqui: stackoverflow.com/a/20552186/1246870
avs099
Veja minha resposta - por padrão, uma instalação limpa do IIS desativa as web.configsubstituições das configurações de compactação, e é por isso que você precisa modificar o arquivo applicationHost.config. Em vez de alterar as configurações de compactação, no entanto, você pode permitir substituições e voltar aos negócios.
Mcw # 13/14
3

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

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

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

Também tivemos que especificar a codificação devido a um erro no código de compactação:

Há um erro no código de compactação que não analisa o charset no cabeçalho de resposta corretamente, portanto, você precisará configurar "application / xml; charset = utf-8" nas configurações de compactação dinâmica para que funcione.

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>
Jeff Atwood
fonte
3

Em uma nova instalação, meu applicationHost.config(in %windir%\system32\inetsrv\config) tinha a seguinte configuração:

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

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

Mudando isso para:

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

ativa a configuração da httpCompressiontag sob a system.webServertag em my web.config.

Confirmei isso definindo a httpCompressionseção do applicationHost.configpara:

<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 eu posso definir todos os tipos MIME que realmente quero compactar no web.config.

mcw
fonte
O rastreamento de solicitação com falha foi muito útil para solucionar esse problema: iis.net/learn/troubleshoot/using-failed-request-tracing/…
mcw:
Isso não funciona no IIS8 +. Você tem alguma experiência em fazer com que o httpCompressionelemento funcione em web.confignível nas versões mais recentes do IIS ou é impossível? Os documentos são um pesadelo - não parece dizer qual é o acordo oficial.
theyetiman
@theyetiman - desculpe, eu não trabalhei com o IIS8 +. Boa sorte.
Mcw #
0

Para adicionar tipos de mimet 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 ter a primeira correspondência. Isso significa que mimeTypes com caracteres curinga (*) deve estar abaixo de mimeTypes sem caracteres curinga. Portanto, verifique se o mimeType */*está na parte inferior, pois qualquer entrada abaixo dele não será usada

Editar:

Como o IIS é péssimo, a melhor opção é limpar os staticTypes e adicionar tudo de novo 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}
}
Marius
fonte