如何在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" 
/>

..但我没有得到压缩。 这并没有帮助,我不知道urlCompressionhttpCompression之间有什么不同。 我试图找出,但无济于事!

可以,事实上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

下一篇: HttpWebResponse LastModified