如何让 gzip 压缩在 WCF 4.5 中工作

Posted

技术标签:

【中文标题】如何让 gzip 压缩在 WCF 4.5 中工作【英文标题】:How to get gzip compression working in WCF 4.5 【发布时间】:2013-03-18 18:54:12 【问题描述】:

WCF 4.5 支持 GZIP,无需第三方库或手写扩展。 我通过 TCP 绑定使其工作,但找不到通过 HTTP 绑定使其工作的方法。 我的 wcf - 服务自托管在 Windows 服务中。

插件:我不允许使用 IIS;我无法切换到任何 WCF 替代品。

这适用于 gzip:

binding="customBinding" bindingConfiguration="tcpCompressionBinding" name="tcp" 

这是我目前用于http的:

binding="basicHttpBinding" bindingConfiguration="httpBinding" name="http"

文档并没有真正帮助我: http://msdn.microsoft.com/en-us/library/dd456789.aspx.

但是,根据这个它应该可以工作:

从 WCF 4.5 开始,WCF 二进制编码器增加了对压缩的支持。压缩类型由 CompressionFormat 属性配置。客户端和服务都必须配置 CompressionFormat 属性。压缩适用于 HTTP、HTTPS 和 TCP 协议。如果客户端指定使用压缩但服务不支持它,则会引发协议异常,指示协议不匹配。有关详细信息,请参阅选择消息编码器

【问题讨论】:

前段时间我在使用 WCF 4.0 时遇到了同样的问题 不这么认为。 wcf 4.0 没有内置 gzip 支持。这是 4.5 的功能。 我猜您已经在文档中阅读了此内容,但以防万一您错过了它:“从 WCF 4.5 开始,WCF 二进制编码器增加了对压缩的支持。这使您能够使用 gzip/deflate 算法从 WCF 客户端发送压缩消息,并使用自托管 WCF 服务的压缩消息进行响应。此功能启用对 HTTP 和 TCP 传输的压缩。始终可以通过配置 IIS 启用 IIS 托管的 WCF 服务以发送压缩响应主机服务器。压缩类型由 CompressionFormat 属性配置。" "由于此属性仅在 binaryMessageEncodingBindingElement 上公开,因此您需要创建如下自定义绑定才能使用此功能: 客户端和服务都需要同意发送和接收压缩消息,因此必须在客户端和服务的 binaryMessageEncoding 元素上配置 compressionFormat 属性。 " 您检查过 IIS 级压缩吗? ***.com/questions/1735088/… 【参考方案1】:

根据要求,我复制了我的评论作为答案:

“由于此属性仅在 binaryMessageEncodingBindingElement,您需要创建一个自定义 像下面这样绑定来使用这个特性:

<customBinding>
  <binding name="BinaryCompressionBinding"> 
    <binaryMessageEncoding compressionFormat="GZip"/> 
    <httpTransport /> 
  </binding>
</customBinding> 

并接收压缩消息,因此压缩格式 属性必须在 binaryMessageEncoding 元素上配置 客户端和服务。 "客户端和服务都需要同意发送

【讨论】:

我知道的旧帖子。但这对我不起作用。知道为什么吗? 如何在代码中做到这一点?我需要创建自定义绑定还是创建var binding = new NetTcpBinding() 然后var elements = binding.CreateBindingElements() 然后elements.Add(new BinayMessageEncodingBindingElementCompressionFormat=Gzip)?这会更改绑定或elements“丢失”吗?

以上是关于如何让 gzip 压缩在 WCF 4.5 中工作的主要内容,如果未能解决你的问题,请参考以下文章

如何将单个 WCF 服务配置为具有多个 HTTP 和 HTTPS 端点?

WCF RESTFul服务中的异常处理

在 IIS8 中使用 Gzip 进行 Json HTTP 压缩

如何使用GZIP压缩优化您的网站

怎么让.NET支持gzip压缩页面的功能

如何将 Hadoop 目录压缩为单个 gzip 文件?