Warum ignoriert IIS 7 bestimmte (aber nicht alle) MIME-Typen für die Komprimierung? Fehler geben: DYNAMIC_COMPRESSION_NOT_SUCCESS - Grund 12

11

Ich bin also ein bisschen wie ein IIS7 n00b, aber ich habe die meisten alten IIS-Systeme verwendet, die auf 3 zurückgehen. Ich versuche, die dynamische Komprimierung zu aktivieren, und sie funktioniert hauptsächlich. Es funktioniert nicht für meine ADO.Net Data Service (Astoria) -Anfragen, gestapelt oder nicht.

Ich fand die FREB-Ablaufverfolgung (Failed Request), die sehr hilfreich war. Und was ich auf ungeschlagenen Anfragen sehe, ist Reason Code 12, NO_MATCHING_CONTENT_TYPE. OK, ich habe nicht den passenden MIME-Typ angegeben, das ist einfach.

Nur dass ich das in meiner web.config habe (was ich für richtig halte, aber vielleicht nicht).

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

Jetzt denke ich, dass dies bedeutet, dass jede Anfrage komprimiert werden sollte, die den Accept: Gzip-Header enthält. Ich würde gerne wissen, was andere hier denken könnten.

Meine Geigenspur:

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
quelle
1
BENUTZEN SIE NOTEPAD, um applicationHost.config zu bearbeiten. Ich habe einige Stunden zuvor verschwendet, um zu verstehen, dass meine in Notepad ++ (sowie im Visual Studio 2010-Editor !!) vorgenommenen Änderungen nicht von IIS übernommen werden. Eine alternative Möglichkeit, der Auflistung dynamicTypes / staticTypes zusätzlichen mimeType hinzuzufügen, ist die Verwendung von appcmd. "C:\Windows\System32\Inetsrv\Appcmd.exe" set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/javascript',enabled='True']" /commit:apphostUnd noch einmal: Nachdem diese Änderungen vorgenommen wurden, werden sie nur im Editor angezeigt. Notepad ++ (sowie Visual Studio 2010 Editor !!)
Sasha
Alexander, ich bin nicht 100% sicher, dass ich verstehe, was Sie hier sagen, aber ich kann mit Sicherheit sagen, dass das Ändern der IIS-Konfiguration mit einem beliebigen Texteditor einwandfrei funktioniert. Möglicherweise haben Sie Schwierigkeiten mit einem Editor, der eine Stücklistenmarkierung hinzufügt, aber ansonsten sollte dies in Ordnung sein. In meinem Fall war es nicht so, dass ich den Editor nicht zum Bearbeiten verwenden konnte, sondern nur, dass ich die falsche Datei bearbeitet habe. Nicht alle Konfigurationsänderungen können in der web.config vorgenommen werden, die sich im Webstamm der Anwendung befindet. Einige müssen gegen appHost im Systemordner erstellt werden.
Peter Oehlert
6
@alexander: Richtig, wenn Sie 32-Bit-Anwendungen wie Notepad ++ oder Visual Studio in einem 64-Bit-Fenster verwenden, löst WOW64 die Dateiumleitung für den System32-Ordner aus. Durch die Bearbeitung wird ein Klon in C: \ WINDOWS \ SysWOW64 erstellt, der nur für 32-Bit-Programme sichtbar ist, und er wird niemals von IIS verwendet, das ein 64-Bit-Programm ist
Fredrik Haglund,
Notepad funktioniert tatsächlich ... Notepad ++ und Visual Studio werden umgeleitet.
Brian White
@FredrikHaglund Heiliger Rauch. Ich würde vorschlagen, diesen Kommentar in eine eigene Antwort mit einer Erklärung aufzunehmen ... Ich hatte keine Ahnung, dass so etwas passieren würde, und hätte meinen Schwanz noch viele Stunden lang verfolgt, wenn ich Ihren Kommentar nicht gesehen hätte. (Props auch an Sasha und Brian White, die das Problem ebenfalls erwähnt haben, aber Ihr Kommentar scheint dem Kern des Problems am nächsten zu kommen.)
Beska

Antworten:

7

OK, es stellt sich heraus, dass Sie dies nicht in der web.config konfigurieren können, sondern nur in der appHost.config. Ich nahm an, dass in den Dokumenten appHost.config angegeben war, aber ich hatte angenommen, dass es sich um eine Spezifikation eines allgemeinen Konzepts handelt, nicht um den einzigen zulässigen Konfigurationsort.

Peter Oehlert
quelle
Richtig. Die Konfiguration von system.webServer erlaubt httpCompression auf Website-Ebene nicht. Sie können dasselbe im Stammverzeichnis konfigurieren, dh in der applicationhost.config.
Vivek Kumbhar
hmm .. docs sagen, dass es auf web.config-Ebene angewendet werden kann - scrollen Sie nach unten: msdn.microsoft.com/en-us/library/ms690689(v=vs.90).aspx und sehen Sie sich "Konfigurationsspeicherorte" an. Tabelle .. Ist es ein Problem in der Dokumentation?
avs099
@ avs099 Ich weiß es nicht. Als ich dies vor 3 Jahren gepostet habe, bin ich sicher, dass ich mit web.config angefangen habe und b / c gepostet habe, dass es nicht funktioniert hat. Möglicherweise hat sich die Funktionalität in einem Patch geändert oder die Dokumentation ist falsch. Wäre gut zu testen, um es herauszufinden.
Peter Oehlert
1
Oh - vielleicht war mir nicht klar - wie ich die Dokumentation gelesen habe, heißt es, dass httpCompression in web.config verwendet werden kann - aber ich konnte es nicht zum Laufen bringen, so dass ich auch die Datei applicationHost.config geändert habe. Für mich sieht die Dokumentation irreführend aus. Ich werde meine Antwort bei SO hier verlinken
avs099
Siehe meine Antwort - Standardmäßig deaktiviert eine saubere IIS-Installation das web.configÜberschreiben von Komprimierungseinstellungen, weshalb Sie die ändern müssen applicationHost.config. Anstatt die Komprimierungseinstellungen dort zu ändern, können Sie stattdessen einfach Überschreibungen zulassen, und Sie sind wieder im Geschäft.
mcw0933
3

Peter, danke für den Hinweis - wir haben auch diese Einstellung gefunden

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

im <httpCompression>Abschnitt applicationHost.configbehoben dies.

Wir mussten auch die Codierung aufgrund eines Fehlers im Komprimierungscode angeben :

Es gibt einen Fehler im Komprimierungscode, der den Zeichensatz im Antwortheader nicht korrekt analysiert. Daher müssen Sie "application / xml; charset = utf-8" in den Einstellungen für die dynamische Komprimierung konfigurieren, damit er funktioniert.

Hier ist der relevante Abschnitt vollständig

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

Bei einer Neuinstallation hatte mein applicationHost.config(in %windir%\system32\inetsrv\config) die folgende Einstellung:

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

... sowie einen Standardsatz von MIME-Typen zum Komprimieren, der leider nicht JSON und andere Datentypen enthält, die gute Komprimierungskandidaten wären.

Umschalten auf:

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

Aktiviert die Konfiguration des httpCompressionTags unter dem system.webServerTag in my web.config.

Ich habe dies bestätigt, indem ich den httpCompressionAbschnitt von applicationHost.configauf: gesetzt habe.

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

... und jetzt kann ich alle MIME-Typen einstellen, die ich tatsächlich in der komprimieren möchte web.config.

mcw0933
quelle
Die fehlgeschlagene Ablaufverfolgung von Anforderungen war für mich sehr hilfreich bei der Fehlerbehebung: iis.net/learn/troubleshoot/using-failed-request-tracing/…
mcw0933
Dies funktioniert für IIS8 + überhaupt nicht. Haben Sie Erfahrung damit, dass httpCompressionElemente web.configin neueren Versionen von IIS auf der Ebene funktionieren, oder ist dies unmöglich? Docs sind ein Albtraum - es scheint nicht zu sagen, was der Deal irgendwo offiziell ist.
Theyetiman
@theyetiman - Entschuldigung, ich habe überhaupt nicht mit IIS8 + gearbeitet. Viel Glück.
mcw0933
0

Verwenden Sie die folgenden Befehle, um fehlende Mimetypen aus Powershell hinzuzufügen:

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

Beachten Sie, dass die Reihenfolge der mimeTypes wichtig ist, da IIS die erste Übereinstimmung zu übernehmen scheint. Dies bedeutet, dass mimeTypes mit Platzhaltern (*) unter mimeTypes ohne Platzhalter liegen sollten. Stellen Sie daher sicher, dass der mimeType*/* unten befindet, da ein Eintrag darunter nicht verwendet wird

Bearbeiten:

IIS ist zum Kotzen, daher ist es am besten, einfach die staticTypes zu löschen und alles in der richtigen Reihenfolge wieder hinzuzufügen:

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
quelle