Perché IIS 7 ignora alcuni tipi di MIME (ma non tutti) per la compressione? Dare errore: DYNAMIC_COMPRESSION_NOT_SUCCESS – Motivo 12

Quindi, sono un po 'di un IIS7 n00b ma ho usato la maggior parte dei vecchi sisthemes IIS tornando a 3. Sto cercando di triggersre la compressione dynamic e sta funzionando, per lo più. Non funziona per le mie richieste di ADO.Net Data Service (Astoria), in forma o less.

Ho trovato la richiesta di fallimento (FREB) traccia che era veramente utile. E quello che vedo su richieste non rimesse è il Reason Code 12, NO_MATCHING_CONTENT_TYPE . OK, quindi non ho il tipo MIME corrispondente specificato, è facile.

  • Come determina l'impostazione dynamicCompressionDisableCpuUsage su IIS7?
  • IIS 7: Non richiedere l'authentication quando in LAN?
  • Wildcard SSL su IIS7 - Ogni sito ha bisogno di un proprio IP?
  • Quali sono i buoni strumenti di test di carico per applicazioni web IIS 7?
  • IIS7 rimuove l'estensione del file
  • URL riscrivere in IIS 7
  • Tranne che questo è quello che ho nel mio web.config (che credo sia corretto, ma forse 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" /> 

    Ora penso che questo significa che dovrebbe comprimere qualsiasi richiesta che include l'intestazione Accept: Gzip. Mi piacerebbe sapere cosa gli altri penseranno qui.

    La mia traccia del fiddler:

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

    4 Solutions collect form web for “Perché IIS 7 ignora alcuni tipi di MIME (ma non tutti) per la compressione? Dare errore: DYNAMIC_COMPRESSION_NOT_SUCCESS – Motivo 12”

    OK, si scopre che non è ansible configurarlo nel web.config, solo l'appHost.config. Ho supposto che i docs dicessero appHost.config ma avevo supposto che fosse una specifica di un concetto generale, non l'unica posizione di configuration ammissibile.

    Da un'installazione nuova, la mia applicationHost.config (in %windir%\system32\inetsrv\config ) ha le seguenti impostazioni:

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

    … nonché un insieme predefinito di tipi MIME per comprimere che, purtroppo, non include JSON e altri tipi di dati che potrebbero essere buoni candidati di compressione.

    Passare a:

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

    consente la configuration del tag httpCompression sotto il tag system.webServer nel mio web.config .

    Ho confermato questa impostazione impostando la sezione httpCompression dell'applicazione httpCompression a:

     <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 adesso posso impostare tutti i tipi MIME che voglio effettivamente comprimere nel web.config .

    Peter, grazie per il suggerimento – abbiamo anche trovato quella impostazione

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

    nella sezione <httpCompression> di applicationHost.config fissato.

    Abbiamo anche dovuto specificare la codifica dovuta ad un bug nel codice di compressione:

    C'è un errore nel codice di compressione che non analizza correttamente il charset nell'intestazione di risposta, quindi dovrai configurare "application / xml; charset = utf-8" nelle impostazioni di compressione dynamic per farlo funzionare.

    Ecco la sezione interessata in pieno

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

    Per aggiungere i mimetipi mancanti da powershell, utilizzare i seguenti comandi:

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

    Si noti che l'ordine dei mimeTypes è importnte, in quanto IIS sembra prendere la prima partita. Ciò significa che i mimeTypes con wildcards (*) dovrebbero essere al di sotto di mimeTypes senza wildcards. Assicurarsi quindi che il mimeType */* sia in basso, poiché nessuna voce di seguito non verrà utilizzata

    Edit:

    IIS succhia, quindi l'opzione migliore è cancellare le staticTypes e aggiungere tutto indietro nell'ordine corretto:

     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} } 
    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.