【问题标题】:How to enable IIS compression for WCF services?如何为 WCF 服务启用 IIS 压缩?
【发布时间】:2010-12-16 15:29:17
【问题描述】:

我目前为我的 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 类型?一旦我让服务器返回一个压缩的答案,客户端会自动解压还是必须在客户端编写代码来解压?


感谢您的帮助

【问题讨论】:

  • 我的问题似乎与stackoverflow.com/questions/1741768/… 重复。该问题适用于 IIS 6,但我认为该解决方案也适用于此。如果是这种情况,我将把这个问题作为一个副本关闭。

标签: wcf compression


【解决方案1】:

我遇到了同样的问题; .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”。
  • complete 内容类型(包括“;charset=utf-8”)添加到该部分后,它起作用了:
<add mimeType="application/xml; charset=utf-8" enabled="true" />

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

【讨论】:

  • 提醒:先做好备份。文件是c:\windows\system32\inetsrv\config\applicationHost.config
【解决方案2】:

【讨论】:

  • 这是一个死产品 ;-)
【解决方案3】:

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

【讨论】:

  • 感谢您的回答。我的客户端应用程序是一个基本的 WinForms 应用程序,所以我应该能够使用 EnableDecompression。您的回答意味着您已成功在服务器上启用压缩。是在 IIS 7 上吗?你是怎么配置的?知道为什么我不能让服务器返回压缩响应吗?
【解决方案4】:

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

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

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

我发现 GUI 方式很简单。本文向您展示了如何确认它与 Fiddler 一起使用。

干杯!

【讨论】:

    猜你喜欢
    • 2011-03-10
    • 1970-01-01
    • 2021-07-31
    • 2021-03-13
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多