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

本文关键字:记录 WCF 请求 响应 求和 检查 消息 端点 MSMQ | 更新日期: 2023-09-27 18:09:08

我正在开发一个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)]

即使我构建了一个响应对象,'reply'在检查器的beforeendreply方法中也将为空,因为没有一个将被发送回客户端。

目前看来唯一可行的方法是将日志记录从消息检查器移到我的消息处理器逻辑中,在这里我处理请求并构建响应。如果可能的话,我还是喜欢保持我现在的设置。

问题是,虽然看起来不太可能,"是否有可能在检查器的beforeendreply方法参数中使用MSMQ有一个回复消息?"

提前感谢。问候。


编辑2015.08.27

我已经使用消息检查器放弃了日志记录。现在登录我的服务层。这是我所做的。我仍然愿意听取建议。

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

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

是否可以在检查器的beforeendreply方法参数,使用MSMQ?

不,它不是。