使用MSMQ端点上的消息检查器记录WCF请求和响应

时间:2015-08-21 09:01:01

标签: c# wcf msmq msmq-wcf idispatchmessageinspector

我正在使用WCF服务层,它使用message inspectors来记录请求和回复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方法中的'reply'也将为null,因为没有一个会被发送回客户端。

目前唯一看似合理的事情是将日志从消息检查器移动到我的消息处理器逻辑中,在那里我处理请求,并构建响应。如果可能,我仍然希望保留当前的设置。

问题是,虽然看似不太可能,“是否可以在检查员的BeforeSendReply方法参数中使用MSMQ获得回复消息?”。

提前致谢。 问候。

编辑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, ...);
    }
}

1 个答案:

答案 0 :(得分:0)

  

是否可以在检查员中收到回复消息   BeforeSendReply方法参数,使用MSMQ?

不,不是。