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


11

Quindi, sono un po 'un IIS7 n00b ma ho usato la maggior parte dei vecchi sistemi IIS risalendo a 3. Sto cercando di attivare la compressione dinamica e funziona, soprattutto. Non funziona per le mie richieste ADO.Net Data Service (Astoria), raggruppate o meno.

Ho trovato la traccia della richiesta non riuscita (FREB) che è stata davvero utile. E quello che vedo su richieste non abbinate è Reason Code 12, NO_MATCHING_CONTENT_TYPE. OK, quindi non ho specificato il tipo MIME corrispondente, è facile.

Tranne questo è quello che ho nel mio web.config (che penso 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 significhi che dovrebbe comprimere qualsiasi richiesta che includa l'intestazione Accept: Gzip. Mi piacerebbe sapere cosa potrebbero pensare gli altri qui.

La mia traccia di 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 ***

1
USARE NOTEPAD per modificare applicationHost.config. Ho perso diverse ore prima di capire che le mie modifiche apportate in notepad ++ (così come nell'editor di Visual Studio 2010 !!) non sono applicate da IIS. Un modo alternativo per aggiungere ulteriori mimeType alla raccolta dynamicTypes / staticTypes è usare appcmd. "C:\Windows\System32\Inetsrv\Appcmd.exe" set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/javascript',enabled='True']" /commit:apphostE ancora: dopo aver apportato queste modifiche, le vedrai solo nel blocco note. Notepad ++ (oltre all'editor di Visual Studio 2010 !!)
Sasha,

Alexander, non sono sicuro al 100% di capire cosa stai dicendo qui, ma posso dire con certezza che la modifica della configurazione di IIS con qualsiasi editor di testo funziona bene. Potresti avere difficoltà con un editor che aggiunge un marcatore DBA, ma a parte questo dovrebbe andare bene. Nel mio caso, non è stato che non potevo usare il blocco note per modificarlo, solo che stavo modificando il file sbagliato. Non tutte le modifiche alla configurazione possono essere eseguite nel web.config che si trova nella radice del web dell'applicazione. Alcuni devono essere creati contro appHost nella cartella Sistema.
Peter Oehlert,

6
@alexander: vero, l'utilizzo di applicazioni a 32 bit come Notepad ++ o Visual Studio su una finestra a 64 bit consentirà a WOW64 di attivare il reindirizzamento dei file per la cartella System32. La modifica creerà un clone in C: \ WINDOWS \ SysWOW64 visibile solo ai programmi a 32 bit e non verrà mai utilizzato da IIS che è un programma a 64 bit
Fredrik Haglund,

Notepad funziona davvero ... Notepad ++ e Visual Studio vengono reindirizzati.
Brian White,

@FredrikHaglund Holy fuma. Suggerirei di inserire quel commento nella sua risposta con qualche spiegazione ... Non avevo idea che sarebbe successo qualcosa del genere, e avrei inseguito la mia coda per molte altre ore se non avessi visto il tuo commento. (Propone anche a Sasha e Brian White che hanno anche menzionato il problema, ma il tuo commento sembra avvicinarsi al
nocciolo

Risposte:


7

OK, risulta che non puoi configurarlo in web.config, solo in appHost.config. Supponevo che i documenti dicessero appHost.config ma avevo ipotizzato che fosse una specifica di un concetto generale, non l'unica posizione di configurazione consentita.


Corretta. La configurazione di system.webServer non consente httpCompression a livello di sito Web. È possibile configurare lo stesso alla radice, ad esempio in applicationhost.config.
Vivek Kumbhar,

hmm .. docs DICONO che può essere applicato a livello web.config - scorrere fino in fondo: msdn.microsoft.com/en-us/library/ms690689(v=vs.90).aspx e guardare "Posizioni di configurazione" tabella .. È un problema nella documentazione?
avs099,

@ avs099 Non lo so. Quando l'ho pubblicato 3 anni fa, sono sicuro di aver iniziato con web.config e ho pubblicato b / c che non funzionava. Forse la funzionalità è cambiata in una patch o i documenti sono sbagliati. Sarebbe bello testare per scoprirlo.
Peter Oehlert,

1
oh - forse non ero chiaro - il modo in cui leggo la documentazione, dice che httpCompression PU CAN essere usato in web.config - ma non sono riuscito a farlo funzionare, quindi ho finito per modificare anche il file applicationHost.config. A me sembra che la documentazione sia fuorviante. Io collegare la mia risposta a SO qui: stackoverflow.com/a/20552186/1246870
avs099

Vedi la mia risposta: per impostazione predefinita, un'installazione IIS pulita disattiva le web.configsostituzioni delle impostazioni di compressione, motivo per cui è necessario modificare il file applicationHost.config. Invece di modificare lì le impostazioni di compressione, puoi semplicemente consentire le sostituzioni e sei di nuovo in affari.
Mc

3

Peter, grazie per il suggerimento: abbiamo anche trovato quell'ambientazione

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

nella <httpCompression>sezione di applicationHost.configrisolto questo.

Abbiamo anche dovuto specificare la codifica a causa di un bug nel codice di compressione:

Nel codice di compressione è presente un bug che non analizza correttamente il set di caratteri nell'intestazione della risposta, quindi dovrai configurare "application / xml; charset = utf-8" nelle impostazioni di compressione dinamica per farlo funzionare.

Ecco la sezione pertinente per intero

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

3

Da una nuova installazione, my applicationHost.config(in %windir%\system32\inetsrv\config) aveva la seguente impostazione:

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

... oltre a un set predefinito di tipi MIME per comprimere che, sfortunatamente, non include JSON e altri tipi di dati che sarebbero buoni candidati alla compressione.

Passando a:

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

abilita la configurazione del httpCompressiontag sotto il system.webServertag in my web.config.

Ho confermato questo impostando la httpCompressionsezione di applicationHost.configa:

<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 ora posso impostare tutti i tipi MIME che in realtà voglio comprimere in web.config.


La traccia richieste non riuscite è stata molto utile per me nella risoluzione dei problemi: iis.net/learn/troubleshoot/using-failed-request-tracing/…
mcw

Questo non funziona affatto per IIS8 +. Hai esperienza nel far funzionare l' httpCompressionelemento a web.configlivello nelle nuove versioni di IIS o è impossibile? I documenti sono un incubo - non sembra dire quale sia l'accordo da nessuna parte ufficiale.
theyetiman,

@theyetiman - scusa, non ho mai lavorato con IIS8 +. In bocca al lupo.
Mc

0

Per aggiungere 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 è importante, poiché IIS sembra prendere la prima corrispondenza. Ciò significa che mimeTypes con caratteri jolly (*) dovrebbe essere inferiore a mimeTypes senza caratteri jolly. Pertanto, assicurati che mimeType */*sia in fondo, poiché qualsiasi voce sottostante non verrà utilizzata

Modificare:

IIS fa schifo, quindi l'opzione migliore è semplicemente cancellare i staticTypes e aggiungere di nuovo tutto 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}
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.