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

时间:2009-11-14 18:11:57

标签: wcf compression

我目前在我的WCF服务中使用自定义gzip编码器。如果可能的话,我想用内置的IIS 7压缩替换它。我无法在网上找到有关如何做到这一点的信息。

有没有办法为WCF服务启用IIS 7压缩? 你知道这是否会得到.Net 4开箱即用的支持吗?

编辑6月15日: 我仍然在寻找一种方法来用主流方法替换我们的自定义gzip编码器,所以如果你知道如何做到这一点使用.Net 4和IIS 7,请回答这个问题。

由于


补充工具栏:我尝试手动执行此操作

由于我无法通过简单地转动几个旋钮来找到它,我决定尝试手动启用它。

到目前为止,我有:

  • 安装并启用了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 个答案:

答案 0 :(得分:9)

我有同样的问题; .aspx页面已被压缩但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服务的网站启用动态内容压缩
  • 打开%SystemRoot%\ system32 \ inetsrv \ config \ applicationhost.config并将相关内容类型添加到
  • 在此之后它仍然无效。
  • 我使用Firefox的Tamper Data检查数据,发现返回的内容类型实际上是“application / xml; charset = utf-8”。
  • 在该部分添加完整内容类型(包括“; charset = utf-8”)之后,它可以正常运行:
<add mimeType="application/xml; charset=utf-8" enabled="true" />

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

答案 3 :(得分:1)

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

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

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

我发现GU​​I很简单。文章向您展示了如何确认它与Fiddler合作。

干杯!