为什么gzip压缩在IIS中的效率变化?

在运行Fiddler的时候,我注意到了一个对我的服务器的静态〜5MB的XML文件的请求有些奇怪:尽pipe发送字节对于字节相同的标题(编辑:包括标题),响应是不同的:

答案A:
1. 700KB的gzip内容
2.包含Content-Length标题
3.排除了Transfer-Encoding标题

答案B:
1. 1000KB的gzip内容
2.排除Content-Length标题
3.包括传输编码标头:分块标头

我能做些什么,以便始终如一地接收响应A中显示的更高带宽效率的行为?

原始请求:

GET http://[REDACTED]/[REDACTED]/[REDACTED]/[REDACTED].xml?dt=Test1 HTTP/1.1 Host: [REDACTED] Connection: keep-alive Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31 Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

原始答复A:

 HTTP/1.1 200 OK Content-Type: text/xml Content-Encoding: gzip Last-Modified: Tue, 07 May 2013 04:04:01 GMT Accept-Ranges: bytes ETag: "80ceefe7d74ace1:0" Vary: Accept-Encoding Server: Microsoft-IIS/7.5 X-Powered-By: ASP.NET Date: Tue, 07 May 2013 21:07:21 GMT Content-Length: 728105 [700KB GZipped Body] 

原始答复B:

 HTTP/1.1 200 OK Transfer-Encoding: chunked Content-Type: text/xml Content-Encoding: gzip Last-Modified: Tue, 07 May 2013 04:04:01 GMT Accept-Ranges: bytes ETag: "60be30e8d74ace1:0" Vary: Accept-Encoding Server: Microsoft-IIS/7.5 X-Powered-By: ASP.NET Date: Tue, 07 May 2013 21:07:14 GMT [1MB Gzipped Body] 

静态文件的压缩是dynamic处理的(如果启用了dynamic压缩),而文件被IIS视为不频繁 。 一旦文件被认为是频繁的 ,它将被压缩和caching(如果启用了静态压缩)。 caching的版本将继续被服务,直到它再次不经常。 您可以在IIS中使用2个configuration设置来configuration频繁文件:

system.webServer / serverRuntime中:

  • frequentHitThreshold :在被认为频繁和caching之前,同一个文件应该被请求多less次? 默认为2。
  • frequentHitTimePeriod :为了被caching,应该请求同一个文件的时间间隔{频率高阈值}次。 默认为10秒。

请注意,无论您设置了频繁的“时间间隔”,如果1分钟后没有请求,频繁的文件将永远不经常出现。 我不知道在configuration中是否有这样的设置。

例如,将frequentHitThreshold设置为1将意味着该文件始终被IIS视为频繁,即使是从第一个请求开始。 这将依次绕过dynamic压缩并仅通过静态压缩来处理。

请注意,dynamic(默认为0)和静态(默认为7)压缩的压缩级别不同,因此会返回2个不同的文件大小。

另外,这就是为什么我首先解决了这个问题:即使对两者使用相同的级别,dynamic和静态压缩的ETag也是不同的。

希望这可以帮助。

很明显,在第一次请求一个静态文件时,IIS在其压缩文件caching中没有该文件的压缩副本,所以它对该请求使用dynamic压缩。 这可以通过将serverRuntime元素的frequentHitTHreshold属性设置为1来解决。

这在这里详细讨论。 如果提供CDN,这个设置可能是唯一值得改变的。

在这里查看关于IISdynamic压缩的更多细节:

http://www.west-wind.com/weblog/posts/2011/May/05/Builtin-GZipDeflate-Compression-on-IIS-7x

基本上,服务器上的CPU负载很高,压缩比较less

这里有更多的细节和如何configuration压缩级别:

http://weblogs.asp.net/owscott/archive/2009/02/22/iis-7-compression-good-bad-how-much.aspx