1

WCF メッセージの内容を gzip エンコードしようとしています。私が見るほとんどの例は、BindingElement と MessageEncodingFactory を持つことについて話しています。

IDispatchMessageInspector の BeforeSendReply でこれを行うことによる副作用はありますか? つまり、メッセージを受け取り、圧縮して元のメッセージと置き換えます。

public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
{
     HttpResponseMessageProperty httpResponseProperty = new HttpResponseMessageProperty();
     httpResponseProperty.Headers.Add(HttpResponseHeader.ContentEncoding, "gzip");
     reply.Properties[HttpResponseMessageProperty.Name] = httpResponseProperty;
     reply = gzip(reply);    
}

gzip は、(xml) 本体を抽出し、gzip されたバイト ストリームに置き換える関数です。

私はラインに沿って何かを探しています

  • いやー!!それはあなたのサーバーを殺すでしょう。
  • いいえ、それはメッセージを x より長く分割します。
  • クライアントはこれを、gzip 圧縮されたメッセージではなく、本文としてランダムな一連のバイトを含むメッセージとして見るため、良い考えではありません。
  • うん、これはうまくいく。また、パフォーマンスへの影響はそれほど大きくありません。

ありがとう!

4

1 に答える 1

2

これは、使用しているバインディングに応じて、機能する場合と機能しない場合があります。SOAP ベースのバインディング (BasicHttpBinding、WSHttpBinding、NetTcpBinding など) を使用している場合、これは機能しません。結局のところ、XMLライターです)。

非 SOAP バインディング (WebHttpBinding など) を使用する場合は、動作する可能性があります (確認するために試してみてください)。非常に大きなメッセージを扱っている場合、(GZip の前と GZip の後に) 数回すべてをバッファリングするというペナルティが発生します。エンコーダーがメッセージを再エンコードしようとしないように to を設定することを忘れないでください (詳細についてはWebBodyFormatMessageProperty、この記事を参照してください)。メッセージを適切にフォーマットします。Raw

また、クライアントがそれを理解していることを確認する必要があります。特に3番目のポイントに関して-クライアントは常にメッセージを一連のバイトとして認識し、それを「理解」するのはクライアント次第です(たとえば、HTTP応答として扱い、ヘッダーと本文を分離するなどして)の上)。

于 2013-10-08T23:21:46.707 に答える