使用.net 4 WCF压缩
我已阅读此文WCF Compression文章 我知道对于.net 4.0 WCF压缩是可用的。使用.net 4 WCF压缩
我找不到任何明确的解释如何使用它,我需要定义任何设置或更改绑定?或者它被自动压缩?
我在IIS7中使用basicHttpBinding。选项“启用动态压缩”设置为true,但我不知道客户端知道如何压缩请求并解压缩响应?
任何解释,包括设置绑定,以减少消息大小将不胜感激。在4MB带宽的远程服务器上工作时,性能非常差。
但我不知道客户端如何知道压缩请求和解压缩响应?
这些都是HTTP规范的一部分。由于WCF使用HTTP & IIS,因此它可以利用Web服务器和客户端HTTP堆栈的内置压缩功能。
退房节14.3: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
基本上,你的客户端需要发送一个报头说它支持压缩。例如:Accept-Encoding: gzip, deflate
。您可以按照WCF客户端部分的文章中的说明进行设置。您的客户端然后将正确的标题发送到服务器。
现在在服务器端,IIS将看到该标题,并且它会压缩响应... 如果配置为这样做。您链接的文章告诉您如何为WCF服务设置IIS进行压缩。然后,服务器将向客户端发回一个标题,告诉它内容已被压缩:Content-Encoding: gzip
。然后,客户将解压缩响应并继续其快乐的方式。
这几乎是它;这只是让客户头部正确并且服务器配置为发送回压缩响应的问题。文章告诉你如何做到这一点。希望帮助
在.NET 4 WCF样品提供压缩样品,
http://www.microsoft.com/en-us/download/details.aspx?id=21459
本博客文章更多的信息解释它,
还有其他职位在MSDN博客上,如
http://blogs.msdn.com/b/dmetzgar/archive/2011/04/29/automatic-decompression-in-wcf.aspx
使用http编码时,启用压缩响应的唯一方法是使用dynamic compression built-in to IIS7 and higher。
但我不知道客户端如何知道压缩请求和解压缩响应?
下面是HTTP提供的开箱即用的描述,它可以与WCF HTTP(S)编码一起使用。除此之外,WCF 4.5还提供gzip and deflatecompression of its binary encoding。
压缩响应是HTTP标准的一部分。在它的请求,客户端信号到服务器,其压缩方法(gzip的,放气,...)它支持由以下头的手段:
Accept-Encoding: gzip, deflate
的服务器,在其自行决定,无限的智慧和神秘方法可以自由地忽略该头部并且发送未压缩的响应,或者可以选择由客户端提供的算法中的任何一种,例如回答如下头部并压缩响应主体。
Content-Encoding: gzip
为了使问题更复杂,服务器可能会也设置了下面的头:
Transfer-Encoding: chunked
这使服务器忽略另外的强制性规定Content-Length
头,作为一般的HTTP头,具有在HTTP主体之前。 (设置chunked
编码affects the way the body gets encoded。)所以,现在它可以即时压缩响应主体,即在压缩时吐出字节,而不必等待整个身体的压缩完成,只是为了能够确定压缩结果的内容长度。这可以节省服务器端的大量内存。 (客户端,然而,现已置于暗处作为对压缩的响应的总大小,直到它完成接收整个响应,使得它的减压略微低效率)
注意然而,使用Accept-Encoding
和Content-Encoding
,正如我刚才所描述的,以透明压缩反应竟是a stupid idea,根据HTTP合着者罗伊菲尔丁,哪些应该被使用,而不是在请求以下标题:
TE: gzip, deflate
而SERV呃,如果选择进行压缩,将下面的头添加到它的响应:
Transfer-Encoding: gzip, chunked
和以前一样,chunked
如果服务器要省略Content-Length
是必要的。
否则,TE
/Transfer-Encoding
组合是语法上等同于所述Accept-Encoding
/Content-Encoding
组合,但含义是不同的,如可以从this longish discussion中收集。
问题的要点是:TE /传输编码使得压缩运输细节,而接受编码/内容编码表示压缩版本作为实际数据(在HTTP用语实体),具有后者缓存请求,代理等不幸后果的数量。然而,TE/Transfer-Encoding船很早就航行了,而且我们被AE/CE组合所困住,它受到大多数客户和服务器的支持,其含义实际上更接近于TE/TE
当谈到压缩请求在HTTP,他们很少在实践中使用,且有客户端要弄清楚,如果服务器支持,没有标准的方式。您可以通过带外(例如硬编码)告诉客户服务器了解压缩请求(和configure the server appropriately)。或者你有你的客户主动尝试压缩一次,如果它产生一个400 Bad Request
(至少这是一个IIS 7.5将返回),你回落到非压缩请求。
请注意,压缩已添加到WCF 4.5。都能在这里找到:http://msdn.microsoft.com/en-us/library/aa751889(v=vs.110).aspx
你必须使用一个自定义绑定来启用它:
<customBinding>
<binding name="BinaryCompressionBinding">
<binaryMessageEncoding compressionFormat="GZip"/>
<httpTransport />
</binding>
</customBinding>
只用二进制编码工作。此外,你必须意识到你的情况。如果您在IIS中托管,则压缩可能已经开启。请看这里:http://blogs.msdn.com/b/dmetzgar/archive/2011/04/29/automatic-decompression-in-wcf.aspx