Pourquoi IIS 7 ignore-t-il certains (mais pas tous) les types MIME pour la compression? Erreur de transmission: DYNAMIC_COMPRESSION_NOT_SUCCESS - Raison 12

11

Donc, je suis un peu un IIS7 n00b mais j'ai utilisé la plupart des anciens systèmes IIS depuis 3. J'essaie d'activer la compression dynamique et cela fonctionne, surtout. Cela ne fonctionne pas pour mes demandes ADO.Net Data Service (Astoria), groupées ou non.

J'ai trouvé le suivi de la demande ayant échoué (FREB) qui était vraiment utile. Et ce que je vois sur les demandes non groupées est Reason Code 12, NO_MATCHING_CONTENT_TYPE. OK, donc je n'ai pas spécifié le type MIME correspondant, c'est facile.

Sauf que c'est ce que j'ai dans mon web.config (qui je pense est correct, mais peut-être pas).

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

Maintenant, je pense que cela signifie qu'il devrait compresser toute demande qui inclut l'en-tête Accept: Gzip. J'adorerais savoir ce que les autres pourraient penser ici.

Ma trace de violoneux:

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
la source
1
UTILISEZ LE BLOC-NOTES pour modifier applicationHost.config. J'ai perdu plusieurs heures avant de comprendre que mes modifications apportées dans le bloc-notes ++ (ainsi que dans l'éditeur Visual Studio 2010 !!) ne sont pas appliquées par IIS. Une autre façon d'ajouter mimeType supplémentaire dans la collection dynamicTypes / staticTypes est d'utiliser appcmd. "C:\Windows\System32\Inetsrv\Appcmd.exe" set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/javascript',enabled='True']" /commit:apphostEt encore une fois: après ces modifications, vous ne les verrez que dans le bloc-notes. Bloc-notes ++ (ainsi que l'éditeur de Visual Studio 2010 !!)
Sasha
Alexander, je ne suis pas sûr à 100% de ce que vous dites ici, mais je peux dire avec certitude que la modification de la configuration IIS avec n'importe quel éditeur de texte fonctionne très bien. Vous pourriez avoir des difficultés avec un éditeur qui ajoute un marqueur de nomenclature, mais à part ça, ça devrait aller. Dans mon cas, ce n'était pas que je ne pouvais pas utiliser le bloc-notes pour le modifier, juste que je modifiais le mauvais fichier. Toutes les modifications de configuration ne peuvent pas être effectuées dans le web.config qui se trouve dans la racine Web de l'application. Certains doivent être créés contre appHost dans le dossier System.
Peter Oehlert
6
@alexander: Vrai, l'utilisation d'applications 32 bits comme notepad ++ ou visual studio sur des fenêtres 64 bits obtiendra WOW64 pour déclencher la redirection de fichiers pour le dossier System32. L'édition créera un clone dans C: \ WINDOWS \ SysWOW64 uniquement visible pour les programmes 32 bits et il ne sera jamais utilisé par IIS qui est un programme 64 bits
Fredrik Haglund
Bloc-notes fonctionne réellement ... Notepad ++ et Visual Studio sont redirigés.
Brian White
@FredrikHaglund Holy fume. Je suggérerais de mettre ce commentaire dans sa propre réponse avec une explication ... Je ne savais pas que quelque chose comme ça se passerait et aurait poursuivi ma queue pendant encore beaucoup d'heures si je n'avais pas vu votre commentaire. (Je remercie également Sasha et Brian White qui ont également mentionné le problème, mais votre commentaire semble se rapprocher le plus du cœur du problème.)
Beska

Réponses:

7

OK, il s'avère que vous ne pouvez pas configurer cela dans le web.config, seulement l'appHost.config. Je supposais que les docs disaient appHost.config mais j'avais supposé que c'était une spécification d'un concept général, pas le seul emplacement de configuration autorisé.

Peter Oehlert
la source
Correct. La configuration de system.webServer n'autorise pas la compression http au niveau du site Web. Vous pouvez configurer la même chose à la racine, c'est-à-dire dans le fichier applicationhost.config.
Vivek Kumbhar
hmm .. les documents disent qu'il peut être appliqué au niveau de web.config - faites défiler vers le bas: msdn.microsoft.com/en-us/library/ms690689(v=vs.90).aspx et regardez les "emplacements de configuration" table .. Est-ce un problème dans la documentation?
avs099
@ avs099 je ne sais pas. Quand j'ai posté cela il y a 3 ans, je suis sûr que j'ai commencé avec web.config et que j'ai posté b / c ça ne fonctionnait pas. Peut-être que la fonctionnalité a changé dans un patch ou que les documents sont incorrects. Ce serait bien de tester pour le savoir.
Peter Oehlert
1
oh - peut-être que je n'étais pas clair - la façon dont je lis la documentation, il est dit que httpCompression PEUT être utilisé dans web.config - mais je n'ai pas pu le faire fonctionner, j'ai donc fini par modifier le fichier applicationHost.config également. Pour moi, cela ressemble à de la documentation trompeuse. Je
lierai
Voir ma réponse - par défaut, une installation IIS propre désactive les web.configremplacements des paramètres de compression, c'est pourquoi vous devez modifier le applicationHost.config. Cependant, au lieu de modifier les paramètres de compression, vous pouvez simplement autoriser les remplacements et vous êtes de retour dans les affaires.
mcw
3

Peter, merci pour l'allusion - nous avons également constaté que le réglage

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

dans la <httpCompression>section de applicationHost.configfixe cela.

Nous avons également dû spécifier l'encodage en raison d'un bug dans le code de compression:

Il y a un bogue dans le code de compression qui n'analyse pas correctement le jeu de caractères dans l'en-tête de réponse, vous devrez donc configurer "application / xml; charset = utf-8" dans les paramètres de compression dynamique pour le faire fonctionner.

Voici la section pertinente dans son intégralité

<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
la source
3

À partir d'une nouvelle installation, mon applicationHost.config(en %windir%\system32\inetsrv\config) avait le paramètre suivant:

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

... ainsi qu'un ensemble par défaut de types MIME pour compresser qui, malheureusement, n'inclut pas JSON et d'autres types de données qui seraient de bons candidats à la compression.

Passer à:

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

active la configuration de la httpCompressionbalise sous la system.webServerbalise my web.config.

J'ai confirmé cela en définissant la httpCompressionsection de la applicationHost.configsur:

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

... et maintenant je peux définir tous les types MIME que je veux réellement compresser dans le web.config.

mcw
la source
Le suivi des demandes ayant échoué m'a été très utile pour résoudre ce problème: iis.net/learn/troubleshoot/using-failed-request-tracing/…
mcw
Cela ne fonctionne pas du tout pour IIS8 +. Avez-vous de l'expérience pour faire fonctionner l' httpCompressionélément au web.configniveau des nouvelles versions d'IIS ou est-ce impossible? Les documents sont un cauchemar - il ne semble pas que l'accord soit officiel.
theyetiman
@theyetiman - désolé, je n'ai pas du tout travaillé avec IIS8 +. Bonne chance.
mcw
0

Pour ajouter des mimetypes manquants dans PowerShell, utilisez les commandes suivantes:

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

Notez que l'ordre des mimeTypes est important, car IIS semble prendre la première correspondance. Cela signifie que les mimeTypes avec caractères génériques (*) doivent être inférieurs aux mimeTypes sans caractères génériques. Par conséquent, assurez-vous que le mimeType */*est en bas, car aucune entrée en dessous ne sera utilisée

Éditer:

IIS craint, donc la meilleure option est de simplement effacer les staticTypes et de tout ajouter à nouveau dans le bon ordre:

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