【问题标题】:Compressing a web service response for jQuery为 jQuery 压缩 Web 服务响应
【发布时间】:2011-06-02 20:48:03
【问题描述】:

我正在尝试压缩来自 ASMX Web 服务的 JSON 响应,以供 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"/>

通过提琴手我可以看到正常的 aspx 和其他压缩工作正常。但是,jQuery ajax 请求和响应正常工作,只是没有任何内容被压缩。

我错过了什么?

【问题讨论】:

    标签: web-services iis-7 compression asmx gzip


    【解决方案1】:

    您只能在 applicationHost.config 中更改 httpCompression。 见this link

    和你一样,我尝试先在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>
    

    【讨论】:

    【解决方案2】:

    请使用 NOTEPAD 编辑 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 中重新打开,它也会向您显示他自己的文件版本(与您在记事本中看到的不同)。

    【讨论】:

    • 您需要使用 64 位编辑器在 64 位系统上编辑 ApplicationHost.config。 VS 和大多数商业编辑器往往是 32 位的。奇怪的是,我的经验是尝试使用 32 位编辑器编辑 applicationhost.config 时它甚至无法打开 - 我得到一个空白页。
    • 我的猜测是,这很可能与文件的文件安全权限有关。 Notepad++ 将允许您编辑您无权访问的文件,并将保留更改打开重新启动,但实际上不会将其保存到原始文件,除非您明确点击“保存”按钮并要求您提供管理员权限。
    【解决方案3】:

    Eric P 的回答大部分是正确的...您需要完全匹配 IIS 在其 HTTP 响应标头中发送的 Content-Type 标头。出于某种原因,我们的 IIS7 服务器响应: 内容类型:应用程序/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 捕获的内容不会有什么坏处 - 包括额外的空格和可能编码为 的制表符。
    【解决方案4】:

    web.config 中的更改不起作用,因为 applicationHost.config 中的以下行:

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

    如果你把它替换为:

    <section name="httpCompression" overrideModeDefault="Allow" />
    

    可以在本地进行更改。

    我认为这更方便,因为您可以对每项服务进行不同的配置,并且如果您必须添加新的 MIME 类型,则无需编辑您的 applicationHost.config。

    下面是一个示例,如何在位于 service 子文件夹中的单个 ASMX 服务上激活 web.config 中的压缩:

    <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 更改了
      我将整个 httpCompression 部分移动到 web.config,但它仍然无法正常工作。是否需要位置?我在 SO 上创建了关于此的其他问题。因此,如果您能提供帮助,将不胜感激。 stackoverflow.com/questions/15473803/…
    • 不,location 不是必需的,它只是将httpCompression 的效果限制为单个服务的一种方式。对于您的问题,您应该检查整个配置文件层次结构。如果您从 applicationHost 中删除了该部分,您可能会从 machine.config 或父目录的 web.config 继承。
    • @Mart 如何使用 Appcmd.exe 对 applicationHost.config 进行更改?我喜欢在 web.config 中管理它的想法。
    • @Jonesome 在iis.net/learn/get-started/getting-started-with-iis/…中看到标题“控制配置的位置”
    • 这在 IIS8+ 中不起作用。找不到任何官方文档说明为什么不这样做,但看起来您只能在 applicationHost.config 中定义 httpCompression 元素,而在其他任何地方都无法定义,无论您对配置部分进行什么设置我>
    【解决方案5】:

    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 位编辑器仍然以某种方式使用错误的文件选择器对话框。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 2021-08-27
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      相关资源
      最近更新 更多