IIS 7为什么忽略某些(但不是全部)MIME类型进行压缩?提供错误:DYNAMIC_COMPRESSION_NOT_SUCCESS-原因12


11

因此,我有点像IIS7 n00b,但是我已经使用了大多数旧的IIS系统,这些系统都可以回溯到3。对于我的ADO.Net数据服务(Astoria)请求(无论是否批量),它均不起作用。

我发现失败的请求(FREB)跟踪非常有用。我在未处理的请求上看到的是Reason Code 12, NO_MATCHING_CONTENT_TYPE。好,所以我没有指定匹配的MIME类型,这很容易。

除了这是我在web.config中拥有的(我认为是正确的,但也许不是)。

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

现在,我认为这意味着它应该压缩任何包含Accept:Gzip标头的请求。我很想知道别人在这里会怎么想。

我的提琴手踪影:

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
请使用NOTEPAD编辑applicationHost.config。我已经浪费了几个小时才了解,我在notepad ++(以及在Visual Studio 2010编辑器中!)所做的更改未被IIS应用。将其他mimeType添加到dynamicTypes / staticTypes集合的另一种方法是使用appcmd。"C:\Windows\System32\Inetsrv\Appcmd.exe" set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/javascript',enabled='True']" /commit:apphost再说一遍:做出这些更改后-您只会在记事本中看到它们。Notepad ++(以及Visual Studio 2010编辑器!)
Sasha

亚历山大,我不是100%肯定我理解您在这里说的话,但是我可以肯定地说,使用任何文本编辑器修改IIS配置都可以。您可能对添加BOM表标记的编辑器有困难,但除此之外应该没问题。就我而言,并不是我不能使用记事本来编辑它,只是我编辑了错误的文件。并非所有配置更改都可以在应用程序Web根目录中的web.config中进行。必须针对System文件夹中的appHost进行一些设置。
Peter Oehlert

6
@alexander:的确,在64位Windows上使用notepad ++或Visual Studio这样的32位应用程序将获得WOW64来触发System32文件夹的文件重定向。编辑将在C:\ WINDOWS \ SysWOW64中创建一个仅对32位程序可见的克隆,并且它永远不会被64位程序的IIS使用
Fredrik Haglund 2012年

记事本实际上可以工作...记事本++和Visual Studio被重定向。
布莱恩·怀特

@FredrikHaglund神圣的烟。我建议将评论添加到自己的答案中并作一些解释...我不知道这样的事情会继续发生,如果我没有看到您的评论,那么我将追逐我的尾巴还要更多个小时。(还向Sasha和Brian White提到了问题,但您的评论似乎最接近问题的核心。)
Beska

Answers:


7

好的,事实证明您不能在web.config中进行配置,只能在appHost.config中进行配置。我以为文档确实说了appHost.config,但是我以为这是一个通用概念的规范,而不是唯一允许的配置位置。


正确。system.webServer配置不允许在网站级别使用httpCompression。您可以在根目录(即applicationhost.config)中进行配置。
Vivek Kumbhar

hmm .. docs确实说它可以在web.config级别应用-滚动到底部:msdn.microsoft.com/zh-cn/library/ms690689(v=vs.90).aspx并查看“配置位置”表..文档中有问题吗?
avs099

@ avs099我不知道。当我3年前发布此文章时,我确定我是从web.config开始的,而我发布的b / c则不起作用。也许补丁中的功能更改或文档错误。测试将有助于找出答案。
Peter Oehlert 2013年

1
哦-可能我不清楚-我阅读文档的方式说可以在web.config中使用httpCompression-但我无法使其正常工作,所以我最终也修改了applicationHost.config文件。在我看来,文档是令人误解的。我将在此处链接我的答案:stackoverflow.com/a/20552186/1246870
avs099 2013年

请参阅我的答案-默认情况下,全新的IIS安装会关闭web.config对压缩设置的覆盖,这就是为什么您必须修改的原因applicationHost.config。不过,您无需更改压缩设置,而仅允许替代,即可恢复正常工作。
mcw

3

彼得,谢谢您的提示-我们也发现了

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

在修复此<httpCompression>部分applicationHost.config

由于压缩代码中的错误,我们还必须指定编码

压缩代码中存在一个错误,该错误无法正确解析响应头中的字符集,因此您必须在动态压缩设置中配置“ application / xml; charset = utf-8”才能使其正常工作。

这是完整的相关部分

<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

在全新安装中,我applicationHost.config(位于中%windir%\system32\inetsrv\config)具有以下设置:

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

...,以及一组默认的MIME类型进行压缩,不幸的是,这些类型不包括JSON和其他可能成为压缩目标的数据类型。

切换到:

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

启用my中httpCompression标签下的system.webServer标签配置web.config

我通过将的httpCompression部分设置为来确认这一点applicationHost.config

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

...现在我可以在中设置我实际上要压缩的所有MIME类型web.config


失败的请求跟踪对我进行故障排除非常有用:iis.net/learn/troubleshoot/using-failed-request-tracing/…–
mcw

对于IIS8 +,这根本不起作用。您是否有任何使httpCompression元素web.config在更高版本的IIS中工作的经验,还是不可能?文件是一场噩梦-似乎并没有说这笔交易对任何官方机构都有影响。
theyetiman

@theyetiman-抱歉,我完全没有使用IIS8 +。祝好运。
mcw

0

要从powershell添加缺少的mimetype,请使用以下命令:

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

注意,mimeTypes的顺序很重要,因为IIS似乎采用了第一个匹配项。这意味着带有通配符(*)的mimeTypes应该低于不带通配符的mimeTypes。因此,请确保mimeType */*位于底部,因为它将不使用其下方的任何条目

编辑:

IIS很烂,因此最好的选择是清除staticTypes并以正确的顺序再次添加所有内容:

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}
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.