我一直尝试在我的Windows Azure托管的WCF Restful服务上启用gzip HTTP压缩失败,该服务仅从GET和POST请求返回JSON.
我已经尝试了很多东西,我很难列出所有这些东西,我现在意识到我一直在处理相互矛盾的信息(关于旧版本的天蓝色等),所以最好从干净的石板开始吧!
我正在使用Visual Studio 2008,使用2010年2月的Visual Studio工具.
所以,根据以下链接 ..
..现在已启用HTTP压缩.我已经使用了以下页面中的建议(仅限URL压缩建议).
http://blog.smarx.com/posts/iis-compression-in-windows-azure
..但我没有压缩.我不知道urlCompression和httpCompression之间的区别是没有用的.我试图找出但无济于事!
可能,Visual Studio的工具是在支持压缩的Azure版本之前发布的,这是一个问题吗?我已经阅读过某些地方,使用最新的工具,您可以选择在发布时使用哪个版本的Azure OS ...但我不知道这是否属实,如果是,我找不到哪里选择.我可以使用预启用http的版本吗?
我也试过了吹嘘的http压缩模块,但没有结果.
有没有人有关于如何实现这一目标的最新建议?即与当前版本的Azure OS相关的建议.
干杯!
史蒂芬
更新:我编辑了上面的代码来修复web.config片段中的类型.
更新2:测试使用下面的答案显示的URL whatsmyip的答复是表示在没有经过任何压缩正在返回从我service.svc我的JSON响应,但静态的HTML页面ARE被用gzip压缩返回.任何关于如何获得压缩的JSON响应的建议都将非常感谢!
更新3:尝试了大于256KB的JSON响应,以查看问题是否是由于JSON响应小于此,如下面的评论中所述.不幸的是,响应仍然没有被压缩.
好吧花了很长时间......但我终于解决了这个问题,我想为其他任何正在挣扎的人发布答案.解决方案非常简单,我已经确认它确实有效!
编辑ServiceDefinition.csdef文件以在WebRole标记中包含此文件:
在您的Web角色中,创建一个文本文件并将其另存为"EnableCompression.cmd"
EnableCompression.cmd应包含以下内容:
%windir%\system32\inetsrv\appcmd set config /section:urlCompression /doDynamicCompression:True /commit:apphost %windir%\system32\inetsrv\appcmd set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/json; charset=utf-8',enabled='True']" /commit:apphost
..就是这样!完成!这为web-role返回的json启用了动态压缩,我认为我在某处读到了一个相当奇怪的mime类型,因此请确保完全复制代码.
好吧,至少我不是一个人 - 而且差不多一年之后它仍然是一个愚蠢的PITA.
问题是MIME类型不匹配.WCF返回JSON响应Content-Type: application/json; charset=UTF-8
.在默认的IIS配置,大约一半的那一页,不包括为可压缩的MIME类型.
现在,可能很想
在web.config中添加一个部分,并将application/json添加到该部分.但这只是浪费一两个小时的坏方法 - 你只能
在applicationHost.config级别更改元素.
所以有两种可能的解决方案.首先,您可以更改WCF响应以使用默认配置中可压缩的MIME类型.text/json
将工作,所以将此添加到您的服务方法将为您提供动态压缩:WebOperationContext.Current.OutgoingResponse.ContentType = "text/json";
或者,您可以使用appcmd和启动任务更改applicationHost.config文件.这个线程讨论了这个问题(以及其他内容).请注意,如果您添加该启动任务并在开发结构中运行它,它将工作一次.第二次失败,因为您已经添加了配置元素.我最终创建了第二个带有单独csdef文件的云项目,因此我的devfabric不会运行该启动脚本.可能还有其他解决方案.
我对前一段中单独项目的建议并不是一个好主意.非幂等启动任务是一个非常糟糕的主意,因为有一天Azure结构将决定为您重新启动角色,启动任务将失败,并且它将进入循环循环.最有可能是在半夜.相反,如本SO线程所讨论的那样,使您的启动任务具有幂等性.