2

私は WCF サービス レイヤーに取り組んでいます。これは、メッセージ インスペクターを使用して、要求と応答の SOAP メッセージをログに記録します。

関係のないコードを取り除いたインスペクタを次に示します。

public class ServiceInspectorBehavior : Attribute, IDispatchMessageInspector, IServiceBehavior
{
    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
    {
        // pass request to BeforeSendReply method
        return request.ToString();
    }

    public void BeforeSendReply(ref Message reply, object correlationState)
    {
        string requestMessage = (string)correlationState;
        string responseMessage = reply.ToString();
        LogManager.Log(request, response);
    }
}

MSMQで最適に機能する新しいビジネス要件が発生するまでは、すべて順調でした。そのため、現在 MSMQ エンドポイントを実装中です。ここでの問題は、メッセージが一方通行であることです。

[OperationContract(Name = "EnqueueRequest", IsOneWay = true)]

応答オブジェクトを作成しても、インスペクターの BeforeSendReply メソッドで「応答」は null になり、クライアントには何も返されません。

現時点でもっともらしいと思われる唯一のことは、ロギングをメッセージ インスペクタからメッセージ プロセッサ ロジックに移動し、そこでリクエストを処理してレスポンスを構築することです。ただし、可能であれば、現在の設定を維持することを好みます。

問題は、一見ありそうにないように見えますが、「MSMQ を使用して、インスペクターの BeforeSendReply メソッドのパラメーターに応答メッセージを含めることは可能ですか?」ということです。

前もって感謝します。よろしく。


編集 2015.08.27

Message Inspector を使用してロギングをやめました。今、私のサービス層にログインしています。これが私がやったことです。私はまだ提案を受け付けています。

public ResponseBase ProcessRequest(RequestBase requestObject)
{
    string requestString = string.Empty;
    string responseString = string.Empty;

    try
    {
        requestString = DataContractSerializerHelper.SerializeObject(requestObject);

        // ...
        // Do magic stuff, build a response object, etc
        // ...

        responseString = DataContractSerializerHelper.SerializeObject(responseObject);
        return responseObject;
    }
    catch(Exception e)
    {
        // Handle/log exception, return a default response, etc
    }
    finally
    {
        Logger.Log(requestString, responseString, ...);
    }
}
4

1 に答える 1

0

MSMQ を使用して、インスペクターの BeforeSendReply メソッドのパラメーターに返信メッセージを含めることはできますか?

いいえそうではありません。

于 2015-08-23T14:55:27.480 に答える