为什么IIS 7会忽略某些(但不是全部)MIMEtypes的压缩? 给出错误:DYNAMIC_COMPRESSION_NOT_SUCCESS – 原因12

所以,我有点IIS7 n00b,但我已经使用了大多数旧的IIS系统回到3.我试图打开dynamic压缩,它的工作,主要是。 它不适用于我的ADO.Net数据服务(Astoria)请求,批处理或不。

我发现失败的请求(FREB)跟踪 ,这真的很有帮助。 而我在Reason Code 12, NO_MATCHING_CONTENT_TYPE请求上看到的是Reason Code 12, NO_MATCHING_CONTENT_TYPE 。 好的,所以我没有指定匹配的MIMEtypes,这很容易。

除了这是我在我的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 *** 

OK,事实certificate,你不能在web.config中configuration这个,只有appHost.config。 我认为文档确实说了appHost.config,但是我认为这是一个通用概念的规范,而不是唯一允许的configuration位置。

从全新安装,我的applicationHost.config (在%windir%\system32\inetsrv\config )有以下设置:

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

…以及一个默认的MIMEtypes来压缩,不幸的是,不包括JSON和其他数据types,这将是很好的压缩候选。

切换到:

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

可以在web.configsystem.webServer标记下configurationhttpCompression标记。

我通过将httpCompression部分设置为:

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

…现在我可以在web.config设置我想要压缩的所有MIMEtypes。

彼得,谢谢你的提示 – 我们也发现了这个设定

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

<httpCompression><httpCompression>部分解决了这个问题。

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

在压缩代码中有一个错误,它不能正确地parsing响应头中的字符集,所以你必须在dynamic压缩设置中configuration“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> 

要从PowerShell添加缺less的mimetypes,请使用以下命令:

 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应该在没有通配符的mimeType下面。 因此,请确保mimeType */*位于底部,因为下面的任何条目都不会被使用

编辑:

IIS很糟糕,所以最好的select是清除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} }