代码之家  ›  专栏  ›  技术社区  ›  Sylvain

如何为WCF服务启用IIS压缩?

  •  9
  • Sylvain  · 技术社区  · 15 年前

    我目前为我的WCF服务使用一个定制的gzip编码器。如果可能的话,我想用内置的IIS7压缩替换它。我在网上找不到关于如何做到这一点的信息。

    有没有办法为WCF服务启用IIS 7压缩? 您知道.Net 4是否支持这一点吗?

    6月15日编辑: 我仍在寻找一种方法,用主流方法取代我们的定制gzip编码器,所以如果您知道如何使用.NET4和IIS7实现这一点,请回答这个问题。

    谢谢


    侧栏:我尝试手动执行此操作

    由于我找不到如何通过简单地转动几个旋钮来实现这一点,我决定尝试手动启用它。

    到目前为止,我已经:

    • 已安装并启用IIS 7动态压缩模块
    • 更改了applicationHost.config文件的节以启用压缩 mimeType="application/soap+xml" mimeType="application/xop+xml" .

    我使用HTTP嗅探器嗅探从我的应用程序(Windows窗体)发送的流量。我看到请求没有 Accept-Encoding:gzip,deflate http头。

    所以我

    • 使用将其手动添加到所有传出呼叫 OperationContextScope 类及其应用 OutgoingMessageProperties . (如果我找到了解决方案,我将在稍后发布详细信息)。

    使用http嗅探器,我可以看到客户端头现在具有正确的头:

    POST /### path to my service ####/MyService.svc HTTP/1.1
    MIME-Version: 1.0
    Content-Type: multipart/related; type="application/xop+xml";
        start="<http://tempuri.org/0>";
        boundary="uuid:####### some uuid #############";
        start-info="application/soap+xml"
    Accept-Encoding: gzip,deflate
    Host: ####### my server name #############
    Content-Length: 1753
    Expect: 100-continue
    

    但是服务器响应仍然没有被压缩。

    为什么服务器响应没有被压缩?我是否使用了正确的mime类型?一旦我让服务器返回一个压缩的答案,客户端会自动解压还是必须在客户端编写代码来解压?


    4 回复  |  直到 14 年前
        1
  •  9
  •   Tim Cooper    13 年前

    我也有同样的问题。aspx页面已压缩,但WCF内容未压缩。它与WCF服务返回的内容类型有关,WCF服务被附加到mime类型。

    我在ApplicationHost.config中使用了以下部分:

    <dynamicTypes>
        <add mimeType="text/*" enabled="true" />
        <add mimeType="message/*" enabled="true" />
        <add mimeType="application/*" enabled="true" />
        <add mimeType="*/*" enabled="false" />
    </dynamicTypes>
    

    以下是我所做的(大部分步骤与前面提到的相同):

    • 为IIS角色安装动态压缩角色服务
    • 为用于承载WCF服务的网站启用动态内容压缩
    • 在这之后,它仍然不起作用。
    • 我用Firefox的篡改数据检查了数据,发现返回的内容类型实际上是“application/xml;charset=utf-8”。
    • 添加 完成
    <add mimeType="application/xml; charset=utf-8" enabled="true" />
    

    因为我觉得字符集编码不应该决定压缩是否有效,所以我最终让IIS压缩所有的application/*内容类型。

        2
  •  1
  •   David Hay    15 年前

    可能这取决于您使用的特定WCF服务设置,但对于我使用过它的应用程序(所有应用程序都是.NET应用程序和Silverlight页面的混合访问),生成的WCF客户端类包含一个可设置为true的EnableDecompression属性。之后,我的Winforms应用程序将发送正确的标题,Web服务通信将被正确压缩。

        3
  •  1
  •   Colin    12 年前

    似乎可以通过GUI或CLI在IIS中启用动态压缩。

    本文向您展示了两种方式:

    http://www.hanselman.com/blog/EnablingDynamicCompressionGzipDeflateForWCFDataFeedsODataAndOtherCustomServicesInIIS7.aspx

    干杯