2011-01-08 48 views
2

我最近在一個定製的編碼器插入(使用二進制編碼器來完成實際的編碼和gzip compresser壓縮字節數組)。它工作正常。現在的問題是小的消息大小實際上使字節數組膨脹。我想知道是否有辦法避免這種情況。特別是如果有一種方法,我可以應用條件壓縮和解壓縮。WCF條件壓縮

我曾嘗試做這樣的事情 - 將一個條件

if(buffer.Count <= 5000) 
skip compression 

但問題是,如果上的字節不壓縮的另一端解壓縮甚至會發生。我希望這是有道理的。

以下是其中的壓縮和解壓發生(從CompactMessageEncoder的代碼片段)

public override Message ReadMessage(ArraySegment<byte> buffer, BufferManager bufferManager, string contentType) 
     { 

      ArraySegment<byte> 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<byte> 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; 
     } 
+0

可能你的是定製頭添加到被壓縮那些郵件? HTTP://計算器。com/questions/964433/how-to-add-a-custom-header-to-every-wcf-calls – 2011-01-08 01:15:18

回答

0

你能寫一個字節將表明數據是否被壓縮與否的功能? 0 =未壓縮,1 = Gzip壓縮,2 - 255 =未來的壓縮算法?

你可以寫未壓縮的長度,但會使用相同的裁切長度不壓縮依賴於服務器和客戶端上。您可以編寫一個布爾值來指示它是否被壓縮,但是仍然需要一整個字節,並且可以通過寫入值0-255來讓自己保持打開狀態以便將來擴展。 (也許你會發現,你的數據,不同的壓縮算法可以提供更好的壓縮。)

2

在您使用的情況下,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.aspxhttp://www.vervestudios.co/projects/compression-tests/

一個潛在的缺點 - 這取決於你的應用程序,是HTTP壓縮只從服務器上完成 - >客戶端,因此,如果您的要求是巨大的,這可能成爲一個問題,但是大概在大多數情況下, ,服務器響應將比客戶端請求更大。 編輯:如果你願意加入custom IHttpModule,您甚至可以要求壓縮工作。

我剛剛成功地從GZIPMessageEncoder將20個服務器的大量使用的場轉移到IIS 7.5的http壓縮。

在一個側面說明,請不要在緩衝傳輸模式,這是默認使用MS」 GzipMessageEncoder例子。 GzipMessageEncoder只是浪費噸的記憶 - 數百兆我的具體情況,請參閱我的答案在這裏:WCF HttpTransport: streamed vs buffered TransferMode