压缩Web服务响应以供jQuery使用

9
我将尝试对来自 ASMX web 服务的 JSON 响应进行 gzip 压缩,以便由 jQuery 在客户端消费。
我的 web.config 已经像这样设置了 httpCompression:(我正在使用 IIS 7)
<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files" 
    staticCompressionDisableCpuUsage="90" staticCompressionEnableCpuUsage="60" 
    dynamicCompressionDisableCpuUsage="80" dynamicCompressionEnableCpuUsage="50">
    <dynamicTypes>
        <add mimeType="application/javascript" enabled="true"/>
        <add mimeType="application/x-javascript" enabled="true"/>
        <add mimeType="text/css" enabled="true"/>
        <add mimeType="video/x-flv" enabled="true"/>
        <add mimeType="application/x-shockwave-flash" enabled="true"/>
        <add mimeType="text/javascript" enabled="true"/>
        <add mimeType="text/*" enabled="true"/>
        <add mimeType="application/json; charset=utf-8" enabled="true"/>
    </dynamicTypes>
    <staticTypes>
        <add mimeType="application/javascript" enabled="true"/>
        <add mimeType="application/x-javascript" enabled="true"/>
        <add mimeType="text/css" enabled="true"/>
        <add mimeType="video/x-flv" enabled="true"/>
        <add mimeType="application/x-shockwave-flash" enabled="true"/>
        <add mimeType="text/javascript" enabled="true"/>
        <add mimeType="text/*" enabled="true"/>
    </staticTypes>
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
</httpCompression>
<urlCompression doDynamicCompression="true" doStaticCompression="true"/>

通过Fiddler工具,我可以看到普通的aspx页面和其他压缩方式都能够正常工作。然而,jQuery Ajax请求和响应虽然按照预期工作,但却没有被压缩。

我漏掉了什么?

5个回答

13

你只能在applicationHost.config中更改 httpCompression 设置。 请参考此链接

和你一样,我先尝试在web.config中更改,但并没有起作用。只有当我在C:\Windows\System32\inetsrv\config\applicationHost.config中添加了以下内容后,它才生效:

  <dynamicTypes>
       ...
       <add mimeType="application/json" enabled="true" />
       <add mimeType="application/json; charset=utf-8" enabled="true" />
       ...
  </dynamicTypes>

请查看以下链接:https://dev59.com/QVPTa4cB1Zd3GeqPgBMR#7634875 - 我无法通过Notepad++编辑applicationHost.config文件。这个链接提供了一个控制台命令,对我很有用。 - Maxim Eliseev

7

不要使用记事本编辑applicationHost.config文件。我曾经浪费了几个小时才明白,我在notepad++(以及Visual Studio 2010编辑器)中进行的更改并没有被IIS应用。

将附加的mimeType添加到dynamicTypes/staticTypes集合的另一种方法是使用appcmd。"C:\Windows\System32\Inetsrv\Appcmd.exe" set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/javascript',enabled='True']" /commit:apphost

再次强调:在这些更改生效后,你只能在记事本中看到它们。Notepad++(以及Visual Studio 2010编辑器)维护着某种奇怪的备份/存储机制来保存applicationHost.config文件。即使在记事本中编辑并在np++/VS中重新打开文件,它也会显示自己版本的文件(与你在记事本中看到的不同)。


6
在64位系统上编辑ApplicationHost.config需要使用64位编辑器。VS和大多数商业编辑器都是32位的。奇怪的是,我的经验是,当尝试使用32位编辑器编辑ApplicationHost.config时,它甚至无法打开 - 我得到一个空白页面。 - Rick Strahl
1
我的猜测是这可能与文件安全权限有关。Notepad++允许您编辑您无权访问的文件,并在重新启动时保留更改,但除非您明确点击保存按钮并请求管理员权限,否则不会将其保存到原始文件中。 - Jon Adams

5

Eric P的回答基本上是正确的...你需要精确匹配IIS在其HTTP响应头中发送的Content-Type标头。由于某种原因,我们的IIS7服务器响应如下: Content-Type: application/json; q=0.5

我以前从未见过服务器响应中有质量因子的情况。太奇怪了。

当我们将此添加到.config文件中的dynamicTypes中时,一切都开始正常工作:

  <dynamicTypes>
       ...
       <add mimeType="application/json" enabled="true" />
       <add mimeType="application/json; q=0.5" enabled="true" />
       <add mimeType="application/json; charset=utf-8" enabled="true" />
       <add mimeType="application/json; q=0.5; charset=utf-8" enabled="true" />
       ...
  </dynamicTypes>

@MaximEliseev:你可能需要使用像Fiddler这样的工具来查看服务器发送的实际Content-Type响应头。我不知道它是否区分大小写,但最好粘贴从Fiddler捕获的内容 - 包括额外的空格和可能编码为 的制表符。 - AlwaysLearning

5

由于applicationHost.config中的以下行,web.config中的更改无法生效:

<section name="httpCompression" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />

如果您将其替换为:
<section name="httpCompression" overrideModeDefault="Allow" />

这些更改可以在本地进行。

我认为这更方便,因为您可以针对每个服务进行不同的配置,而且如果您必须添加新的MIME类型,就不必编辑您的applicationHost.config

以下是一个示例,在service子文件夹中的单个ASMX服务上激活压缩的方法:

<location path="service/MySpecificWebService.asmx">
    <system.webServer>
        <httpCompression>
            <dynamicTypes>
                <add mimeType="application/json" enabled="true" />
                <add mimeType="application/json; charset=utf-8" enabled="true" />
            </dynamicTypes>
        </httpCompression>
        <urlCompression doDynamicCompression="true" />
    </system.webServer>
</location>

关于编辑applicationHost.config的实际操作,我怀疑它并不是文件系统中的真正文件。如果您将该文件复制到桌面上,您就可以使用任何文本编辑器对其进行编辑,然后将其复制回原始文件夹。


我正在尝试从web.config使其工作:applicaionHost.config更改了<section name="httpCompression" overrideModeDefault="Allow" />,并且我将整个httpCompression部分移动到了web.config,但它仍然无法工作。位置是否必需?我在SO上创建了其他问题。如果您能帮忙,我会非常感激。https://dev59.com/e2_Xa4cB1Zd3GeqP48rl - Alex Dn
不需要 location,它只是一种将 httpCompression 的影响限制在单个服务中的方法。针对您的问题,您应该检查整个配置文件层次结构。如果您从 applicationHost 中移除了该部分,则可能继承自 machine.config 或父目录的 web.config - Mart
@Mart 我该如何使用Appcmd.exe来更改applicationHost.config?我喜欢在web.config中管理它的想法。 - Jonesome Reinstate Monica
@Jonesome,请查看http://www.iis.net/learn/get-started/getting-started-with-iis/getting-started-with-appcmdexe#WorkingConfig中的“控制配置位置”标题。 - Mart
这在IIS8+中不起作用。找不到任何官方文档说明为什么不起作用,但看起来你只能在applicationHost.config中定义httpCompression元素,而无论你对配置部分设置了什么样的设置。 - theyetiman

0

http://forums.iis.net/t/1160210.aspx?missing+applicationhost+config

配置文件应该是 %windir%\system32\inetsrv\config\applicationhost.config。 (请注意,如果您的应用程序(正在搜索applicationhost.config)是一个32位应用程序(例如,如果您正在使用32位CMD.EXE),则由于Windows SYSWOW32重定向,您将无法查看配置文件)
关于丢失的applicationhost.config来更改overrideModeDefault属性为Allow的一些说明。这是由于SYSWOW32重定向。
另外,您可能无法看到配置文件,直到您:
1.通过在“文件资源管理器”位置栏中粘贴“%windir%\system32\inetsrv\config\",而不是您的文本编辑器,打开文件夹; 2.右键单击并直接在该文件夹中进行编辑。
这是因为某些64位编辑器仍然使用有缺陷的文件选择对话框。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接