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.
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 ***
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
.
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>
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}
}