2011-01-08 5 views
2

私は最近、カスタムエンコーダ(バイナリエンコーダを使用して実際のエンコードを行い、Gzip圧縮器を使用してバイト配列を圧縮する)を接続しました。それはうまく動作します。問題は、実際にバイト配列を膨張させる小さいメッセージサイズの問題です。私はこれを回避する方法があるかどうかを知りたい。具体的には、条件の圧縮と解凍を適用する方法がある場合です。条件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:// stackoverflow。com/questions/964433 /カスタムヘッダーごとのwcfコールの追加方法 –

+0

@Mitch:これは機能しない可能性があります。私は、メッセージクラスにカスタムヘッダを追加し、それをWriteMessage()関数で圧縮すると言います。 ReadMessage()では、Messageクラスを取得してヘッダーを読み取る前に、そのメッセージを解凍する必要があります。 – stackoverflowuser

答えて

0

あなたはデータが圧縮されたかどうかを示すことになるバイトを書くことができ起こるの機能はありますか? 0 =非圧縮、1 =圧縮Gzip、2 - 255 =将来の圧縮アルゴリズム?

圧縮されていない長さを書き込むこともできますが、圧縮しないために同じカットオフの長さを使用するサーバーとクライアントに依存します。圧縮されているかどうかを示すブール値を書くことができますが、それでもバイト全体が使用されますが、将来の拡張のために値0〜255を書き込むことで自由に使えます。 (あなたのデータで異なる圧縮アルゴリズムがより良い圧縮を与えることがわかるかもしれません。)

2

httpを使用していて、IIS 7以上であれば明らかに難しいです)、組み込みのgzip/deflate圧縮を使用することができます。

もリンクhttp://www.iis.net/ConfigReference/system.webServer/httpCompression

は正確にあなたの問題を解決する「minFileSizeForComp」のようなパラメータを説明してください。また、 'cpuの特定の負荷を超えたら圧縮を無効にする' dynamicCompressionDisableCpuUsage 'のような他の素晴らしいパラメータがたくさんあります。

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からIIS 7.5のhttp圧縮まで20台のサーバーからなる大規模なファームを正常に移行しました。

MSのGzipMessageEncoderの例は、デフォルトのバッファ転送モードでは使用しないでください。 GzipMessageEncoderは数百万メガバイトのメモリを浪費しています。ここで私の答えをご覧ください:WCF HttpTransport: streamed vs buffered TransferMode