wcf条件压缩

我最近插入了一个自定义编码器(使用二进制编码器进行实际编码,使用Gzip压缩器来压缩字节数组)。 它工作正常。 现在的问题是对于小的消息大小,它实际上膨胀了字节数组。 我想知道是否有办法避免这种情况。 特别是如果有办法我可以应用条件压缩和解压缩。

我确实尝试过这样的事情 – 放置一个条件

if(buffer.Count <= 5000) skip compression 

但问题是另一方面即使字节未被压缩也会发生解压缩。 我希望这是有道理的。

以下是压缩和解压缩发生的函数(来自CompactMessageEncoder的代码片段)

 public override Message ReadMessage(ArraySegment buffer, BufferManager bufferManager, string contentType) { ArraySegment decompressedBuffer = DecompressBuffer(buffer, bufferManager); LogWrite("Decompressed from {0} bytes to {1} bytes", buffer.Count, decompressedBuffer.Count); Message returnMessage = _innerEncoder.ReadMessage(decompressedBuffer, bufferManager); returnMessage.Properties.Encoder = this; return returnMessage; } public override ArraySegment WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset) { var buffer = _innerEncoder.WriteMessage(message, maxMessageSize, bufferManager, messageOffset); var compressedBuffer = CompressBuffer(buffer, bufferManager, messageOffset); LogWrite("Compressed from {0} bytes to {1} bytes", buffer.Count, compressedBuffer.Count); return compressedBuffer; } 

如果您正在使用http,并且如果您使用的是IIS 7或更高版本(也可能使用6,但配置显然更难),您可以使用内置gzip / deflate压缩。

请参见http://www.iis.net/ConfigReference/system.webServer/httpCompression

该链接还解释了像’minFileSizeForComp’这样的参数,它们可以准确地解决您的问题。 它还有很多其他很好的参数,比如’dynamicCompressionDisableCpuUsage’,它会在超过某个CPU负载时禁用压缩。

关于http压缩的好处是它是一个标准,客户端和服务器可以根据请求确定他们是否可以或想要使用标准的http请求和响应头进行压缩。 此外,压缩格式可以从gzip更改为deflate,后者具有几个优点,尽管没有那么多使用。 请参阅http://madskristensen.net/post/Compression-and-performance-GZip-vs-Deflate.aspx和http://www.vervestudios.co/projects/compression-tests/

一个潜在的缺点 – 取决于你的应用程序,http压缩只能从服务器 – >客户端完成,所以如果你的请求很大,这可能会成为一个问题,但在大多数情况下,服务器响应将比客户端请求更大。 编辑:如果您愿意添加自定义IHttpModule ,您甚至可以使请求压缩工作。

我刚刚成功地将一个使用频繁的20台服务器场从GZIPMessageEncoder迁移到IIS 7.5的http压缩。

另外,请不要在缓冲传输模式下使用MS’GzipMessageEncoder示例,这是默认设置。 GzipMessageEncoder只是浪费了大量的内存 – 在我的特定情况下数百兆,请看我的答案: WCF HttpTransport:流式传输与缓冲的TransferMode

你能写一个字节来表明数据是否被压缩了吗? 0 =未压缩,1 =压缩Gzip,2 – 255 =未来压缩算法?

您可以编写未压缩的长度,但这将依赖于服务器和客户端使用相同的截止长度进行不压缩。 您可以编写一个布尔值来指示它是否被压缩,但仍然需要整个字节,您可以通过写入值0-255让自己开放以供将来扩展。 (也许您会发现,使用您的数据,不同的压缩算法可以提供更好的压缩。)