1

このAfterReceiveRequest方法では、次のようにします。

MessageBuffer buffer = request.CreateBufferedCopy(int.MaxValue);
Message requestCopy = buffer.CreateMessage();

//handle message stuff here

request = newMessage;
buffer.Close();

上記は最後にストリームの位置を残しますか?基本的に私が求めているのは、バッファリングされたコピーを作成すると、リクエストを再度読み取るときに問題が発生するのでしょうか?

これが私がこの状況に到達した方法です。メッセージインスペクターでは、元々バッファリングされたコピーを作成していませんでしたが、エラーメッセージが表示されました。サービスにリクエストを送信した後、オンラインで調査した後、リクエストはすでに読み取られています。メッセージのコピーを作成する必要があることがわかりました。これによって位置やその他の問題が発生しないことを確認したいだけです。

メッセージインスペクターで使用するコピーを作成することで、メッセージを2回読み取っていません。コピーは、ログ記録のために1回読み取られ、refパラメーターに割り当てられると、サービスを呼び出すときに使用されます。 、 正しい?

4

2 に答える 2

0

メッセージを複数回再利用するには、そのメッセージのメモリ内コピーを作成する必要があります。そのためには、メッセージ オブジェクト インスタンスの CreateBufferCopy を使用します。このメソッドの呼び出しは、メッセージの状態を変更しません。

上記は最後にストリームの位置を残しますか? このタイプのストリームには適用されません。

于 2012-06-27T19:24:52.987 に答える
0

これが私のプロジェクトでの使用方法です。これは、BeforeSendReply メソッドでメッセージのコピーを適切に作成する方法を示しています。使用しようとしている方法ではありませんが、同じコードを適用する必要があります。

    public void BeforeSendReply(ref Message reply, object correlationState)
    {
        var properties = reply.Properties;
        var contextKey = GetContextKey(properties);
        bool statusCodeFound = false;
        var statusCode = HttpStatusCode.OK;
        if (properties.Keys.Contains("httpResponse"))
        {
            statusCode = ((System.ServiceModel.Channels.HttpResponseMessageProperty)properties["httpResponse"]).StatusCode;
            statusCodeFound = true;
        }
        var buffer = reply.CreateBufferedCopy(int.MaxValue);

        //Must use a buffer rather than the origonal message, because the Message's body can be processed only once.
        Message msg = buffer.CreateMessage();

        //Setup StringWriter to use as input for our StreamWriter
        //This is needed in order to capture the body of the message, because the body is streamed.
        StringWriter stringWriter = new StringWriter();
        XmlTextWriter xmlTextWriter = new XmlTextWriter(stringWriter);
        msg.WriteMessage(xmlTextWriter);
        xmlTextWriter.Flush();
        xmlTextWriter.Close();

        var returnValue = stringWriter.ToString();

        // I do my logging of the "returnValue" variable here. You can do whatever you want.

        //Return copy of origonal message with unaltered State
        reply = buffer.CreateMessage();
    }
于 2013-05-09T14:31:29.713 に答える