hereと記載されているメッセージエンコーダは、このジョブを実行する必要があります。
上記の記事(InstallDrive \ WF_WCF_Samples \ WCF \ Extensibility \ MessageEncoder \ Compressionプロジェクトのthisから)とFiddlerのリンクからダウンロードしたサンプルを使用してテストしました。
MSDNのサンプルには正しく動作させるために修正が必要なバグがありますのでご注意ください。 GZipMessageEncoderFactory
クラスにおいて、CompressBuffer
方法は、次の行
ArraySegment<byte> byteArray = new ArraySegment<byte>(bufferedBytes, messageOffset, bufferedBytes.Length - messageOffset);
全体メッセージ本体が圧縮される上記の修正を適用した後
ArraySegment<byte> byteArray = new ArraySegment<byte>(bufferedBytes, messageOffset, totalLength);
に置き換えなければなりません。
圧縮が正しいことを確認するために、FiddlerのAutoDecodeオプションを使用できます。ただし、AutoDecodeはメッセージがContent-Encoding: gzip
HTTPヘッダーの場合にのみ解凍します。
WCFが特定のトランスポート方法に固有の要素を処理しないように、WCFアプリケーションがトランスポートに依存しないように設計されているため、WCFメッセージ呼び出しにHTTPヘッダーを追加することは困難です。
しかし、このアプリケーションの目的のために、私は次のコードを使用してそれを行うことができました:
public string Echo(string input)
{
using (OperationContextScope opScope = new OperationContextScope((IContextChannel)base.Channel))
{
HttpRequestMessageProperty reqProps = new HttpRequestMessageProperty();
reqProps.Headers["Content-Encoding"] = "gzip";
OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = reqProps;
return base.Channel.Echo(input);
}
}
エコーは、MSDNのサンプルからクライアント方法の一つであり、その中に私がアクセスしていますが現在の操作コンテキストでHTTPヘッダーを追加します。
追加のヘルプが必要な場合はお知らせください。
実際には直接的な答えではありません(1つとして投稿されていません)。しかし、私は、何かもっとコンパクト(同じデータで、ワイヤ上ではるかに小さい) –
(いくつかの詳細を知りたい場合は教えてください) –
Marc、あまり冗長でないシリアライザもオプション。このアプローチの利点の1つは、圧縮の問題をメッセージのエンコーディングから完全に切り離すことです。これは、古典的なHTTP圧縮がレスポンスのために達成するものとほとんど同じです。 –