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

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

所以,我有点儿不懂 IIS7,但我使用过大多数旧版 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

好吧,事实证明您无法在 web.config 中配置它,只能在 appHost.config 中配置。我以为文档中确实提到了 appHost.config,但我认为它是一个一般概念的规范,而不是唯一允许的配置位置。

答案2

彼得,谢谢你的提示——我们还发现了设置

<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(in %windir%\system32\inetsrv\config) 具有以下设置:

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

...以及一组默认的 MIME 类型进行压缩,不幸的是,它不包含 JSON 和其他适合压缩的数据类型。

将其切换为:

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

启用我的标签httpCompression下的标签配置。 system.webServerweb.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

答案4

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

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

编辑:

IIS 很糟糕,所以最好的选择就是清除静态类型并按照正确的顺序重新添加所有内容:

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

相关内容