如何在Windows Azure动态内容上启用gzip HTTP压缩
我一直试图在我的Windows Azure托管的WCF Restful服务上启用gzip HTTP压缩失败,该服务仅从GET和POST请求返回JSON。
我已经尝试了很多东西,我很难列出所有这些东西,现在我意识到我一直在处理相互冲突的信息(关于旧版本的azure等),所以最好从一个干净的石板开始!
我正在使用Visual Studio 2008,使用2010年2月的Visual Studio工具。
所以,根据以下链接..
HTTP压缩现在已启用。 我在以下页面使用了建议(仅限URL压缩建议)..
http://blog.smarx.com/posts/iis-compression-in-windows-azure
<urlCompression doStaticCompression="true"
doDynamicCompression="true"
dynamicCompressionBeforeCache="true"
/>
..但我没有得到压缩。 这并没有帮助,我不知道urlCompression和httpCompression之间有什么不同。 我试图找出,但无济于事!
可以,事实上Visual Studio的工具是在支持压缩的Azure版本之前发布的,会是一个问题吗? 我已经阅读过某些地方,使用最新的工具,您可以选择在发布时要使用哪个版本的Azure操作系统......但我不知道这是否属实,如果是这样,我无法找到位置选择。 我可以使用预先启用http的版本吗?
我也尝试过使用HTTP压缩模块,但没有结果。
有没有人有关于如何实现这一点的最新建议? 即与当前版本的Azure操作系统相关的建议。
干杯!
史蒂芬
更新:我编辑了上面的代码来修复web.config片段中的一个类型。
更新2:使用下面答案中显示的whatsmyip URL测试响应显示,我的service.svc中的JSON响应没有任何压缩地返回,但静态HTML页面以gzip压缩返回。 任何有关如何获得JSON响应压缩的建议都会非常感激!
更新3:尝试了大于256KB的JSON响应,以查看问题是否是由于JSON响应小于此,如下面的评论中所述。 不幸的是,响应仍然没有被压缩。
好吧,它花了很长时间......但我终于解决了这个问题,我想为任何正在挣扎的人发布答案。 解决方案非常简单,我已经验证它确实可行!
编辑您的ServiceDefinition.csdef文件以将其包含在WebRole标记中:
<Startup>
<Task commandLine="EnableCompression.cmd" executionContext="elevated" taskType="simple"></Task>
</Startup>
在您的网络角色中,创建一个文本文件并将其保存为“EnableCompression.cmd”
EnableCompression.cmd应该包含这个:
%windir%system32inetsrvappcmd set config /section:urlCompression /doDynamicCompression:True /commit:apphost
%windir%system32inetsrvappcmd set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/json; charset=utf-8',enabled='True']" /commit:apphost
..就是这样! 完成! 这为web角色返回的json启用了动态压缩,我认为我在某处读取的MIME类型相当奇怪,所以请确保您完全复制代码。
至少我并不孤单 - 在一年之后,它仍然是一个愚蠢的PITA。
问题是MIME类型不匹配。 WCF使用Content-Type: application/json; charset=UTF-8
返回JSON响应Content-Type: application/json; charset=UTF-8
Content-Type: application/json; charset=UTF-8
。 大约在该页面一半处的默认IIS配置不包括作为可压缩MIME类型。
现在,将一个<httpCompression>
部分添加到web.config中并添加application / json可能会很诱人。 但是这只是浪费一两个小时的糟糕方式 - 您只能在applicationHost.config级别更改<httpCompression>
元素。
所以有两种可能的解决方案。 首先,您可以将您的WCF响应更改为使用默认配置中可压缩的MIME类型。 text/json
将会工作,因此将此添加到您的服务方法中将为您提供动态压缩: WebOperationContext.Current.OutgoingResponse.ContentType = "text/json";
或者,您可以使用appcmd和启动任务更改applicationHost.config文件。 这是讨论(除其他事项)在这个线程。 请注意,如果您添加该启动任务并在开发结构中运行它,它将会运行一次。 第二次它会失败,因为你已经添加了配置元素。 我最终创建了另一个具有单独csdef文件的云项目,以便我的devfabric不会运行该启动脚本。 可能还有其他解决方案。
更新
我对前一段中单独项目的建议并不是一个好主意。 非幂等启动任务是一个非常糟糕的主意,因为有一天Azure结构会决定为您重新启动角色,启动任务将失败,并且它将进入回收循环。 很可能在半夜。 相反,让你的启动任务是幂等的,就像在这个SO线程中讨论的一样。
为了处理首次部署后出现问题的本地开发结构,我将相应的命令添加到CMD文件中以重置配置。 另外,我在这里专门设置了压缩级别,因为它在某些(所有?)情况下似乎默认为零。
REM Remove old settings - keeps local deploys working (since you get errors otherwise)
%windir%system32inetsrvappcmd reset config -section:urlCompression
%windir%system32inetsrvappcmd reset config -section:system.webServer/httpCompression
REM urlCompression - is this needed?
%windir%system32inetsrvappcmd set config -section:urlCompression /doDynamicCompression:True /commit:apphost
REM Enable json mime type
%windir%system32inetsrvappcmd set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/json; charset=utf-8',enabled='True']" /commit:apphost
REM IIS Defaults
%windir%system32inetsrvappcmd set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='text/*',enabled='True']" /commit:apphost
%windir%system32inetsrvappcmd set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='message/*',enabled='True']" /commit:apphost
%windir%system32inetsrvappcmd set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/x-javascript',enabled='True']" /commit:apphost
%windir%system32inetsrvappcmd set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='*/*',enabled='False']" /commit:apphost
%windir%system32inetsrvappcmd set config -section:system.webServer/httpCompression /+"staticTypes.[mimeType='text/*',enabled='True']" /commit:apphost
%windir%system32inetsrvappcmd set config -section:system.webServer/httpCompression /+"staticTypes.[mimeType='message/*',enabled='True']" /commit:apphost
%windir%system32inetsrvappcmd set config -section:system.webServer/httpCompression /+"staticTypes.[mimeType='application/javascript',enabled='True']" /commit:apphost
%windir%system32inetsrvappcmd set config -section:system.webServer/httpCompression /+"staticTypes.[mimeType='*/*',enabled='False']" /commit:apphost
REM Set dynamic compression level to appropriate level. Note gzip will already be present because of reset above, but compression level will be zero after reset.
%windir%system32inetsrvappcmd.exe set config -section:system.webServer/httpCompression /+"[name='deflate',doStaticCompression='True',doDynamicCompression='True',dynamicCompressionLevel='7',dll='%%Windir%%system32inetsrvgzip.dll']" /commit:apphost
%windir%system32inetsrvappcmd.exe set config -section:system.webServer/httpCompression -[name='gzip'].dynamicCompressionLevel:7 /commit:apphost
链接地址: http://www.djcxy.com/p/62709.html
上一篇: How to enable gzip HTTP compression on Windows Azure dynamic content