如何让 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 上公开,因此您需要创建如下自定义绑定才能使用此功能:根据要求,我复制了我的评论作为答案:
“由于此属性仅在 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 端点?