4

のすべてのメソッドはSystem.ServiceModel.Channels.Message、メッセージ本文を 1 回だけ読み取ることができ、メッセージが読み取られた後に呼び出されると例外で失敗します。msdn のドキュメントでは、メッセージ本文の読み取りのみが可能であることが確認されています。ただし、ToString()既読メッセージを呼び出すと、石鹸の封筒全体、本文、およびすべてが返されるように見えます。

したがって、私の場合、メソッドだけが許可されていれば、読み取られた後でも本体にアクセスできるようです。

私がここに欠けているものはありますか?ToString()いくつかの状況でボディを信頼できないものにするための回避策として使用していますか?

私の場合、いくつかの WCF 操作のエラー ログと からの元のメッセージの取得に取り組んでいますOperationContext.RequestContext.RequestMessageToString()メッセージ本文をログに記録できる唯一の方法であるため、メッセージをログに記録しています。

4

3 に答える 3

8

ToStringはメッセージ本文を出力する場合がありますが、それは保証されませんオブジェクトには多くの種類がありMessageます(これは抽象クラスです)。それらのいくつかは全身を緩衝しますが、他のものはそれの上に前方のみのリーダーしか持っていません。メッセージをバッファリングするメッセージ実装は、が呼び出されたときに本文を書き込む可能性があり、それが表示されています。ToStringただし、これはすべてのメッセージタイプで保証されているわけではありません。多くの場合、本文は、が呼び出されたときに単に「...ストリーム...」と記述されますToString

于 2012-08-16T02:01:40.647 に答える
2

message.toStringメッセージ バッファの作成時に失われる から派生した base64 でエンコードされた文字列を保持する目的で、このメソッドを使用して成功したことを共有したかったbyte[]だけです (バッファは元のメッセージのコピーを作成する唯一の方法であるため、私のコードでは必要でした)。toStringバッファーを作成し、それを使用して XML を作成し、XML を編集した後、メソッドから保存された文字列を使用して base64 文字列を復元しました。この方法はお勧めしませんが、この場合はこれが唯一のオプションであり、特定のコードで機能することはわかっています。とは言っても、私は一般的にそれが最後の手段であるべきだと考えています。

于 2014-07-18T21:20:26.740 に答える
0

メッセージのコピーを作成してから読む必要があります。例えば:

using (MessageBuffer messageBuffer = message.CreateBufferedCopy(Int32.MaxValue))
{
    Message restoredMessage = messageBuffer.CreateMessage();
    message = messageBuffer.CreateMessage();
    return MessageToString(ref restoredMessage);
}

RequestContext.RequestMessage は一方向の呼び出しでは存在しないためToString、機能しません。別の方法では、RequestMessage.ToString()はメッセージ コンテンツを文字列で返します。

于 2012-08-15T20:22:04.163 に答える