使用Azure WebRole后,JSON内容压缩会在一段时间后停止工作

时间:2013-07-19 00:12:54

标签: azure azure-web-roles iis-8 http-compression

根据此MSDN文章Use AppCmd.exe to Configure IIS at Startup,我在Azure中为我的Web API配置了JSON压缩。

我发布了自己的角色并开始测试,根据Fiddler,一切都很好。

以下是一个示例请求标头:

GET http://x.cloudapp.net:8080/api/xyz HTTP/1.1
Accept: application/json
Host: x.cloudapp.net:8080
Accept-Encoding: gzip

以下是一个示例响应标头:

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Content-Encoding: gzip
Expires: -1
Vary: Accept-Encoding
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Thu, 18 Jul 2013 22:27:38 GMT
Content-Length: 2472

稍后只会进行一些Web API调用(比如6秒之后),所有响应都不再被压缩。

请求标题:

GET http://xyz HTTP/1.1
Accept: application/json
Host: sp-test-server2012.cloudapp.net:8080
Accept-Encoding: gzip

响应标题:

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Thu, 18 Jul 2013 22:27:44 GMT
Content-Length: 16255

请注意第二个响应中缺少内容编码

所以我得到了几百个被压缩的调用,然后其余的大多数都是未压缩的。我不时地看到另一个响应被压缩了。或者如果我停止测试一段时间然后恢复它似乎再次开始压缩。

IIS 8中的压缩是“受限制的”还是什么?比方说,如果CPU几乎达到最大值,IIS是否会停止压缩?

在Azure中监控我的WebRole时,在我的重负载测试期间,我的CPU使用率可以超过90%。很难说这是否与结果缺乏压缩相关。内存使用似乎根本不是问题。

我希望这更加可靠和可预测!

2 个答案:

答案 0 :(得分:3)

好吧,显然昨天我的Google Fu让我失望了。我今天找到了答案,IIS确实会或者不会根据CPU使用情况动态压缩内容。 HTTP Compression

有两种设置可控制动态压缩。一个指定何时禁用:dynamicCompressionDisableCpuUsage,默认为90%。另一个指定何时重新启用dynamicCompressionEnableCpuUsage,默认为50%。

你学到的东西。

答案 1 :(得分:0)

本文可能有助于强制压缩:

ASP.NET Web API GZip compression ActionFilter with 8 lines of code

当然,他们会在重负荷情况下收取CPU时间。