从IParameterInspector获取MessageId

时间:2013-11-29 15:50:09

标签: c# wcf logging serialization

作为我的WCF服务的一部分,我想使用请求的操作和提供的输入参数记录传入/传出呼叫。

我还想在相同的日志行中记录请求的MessageIdIParameterInspector看起来很完美,但是MessageId(消息请求对象的一部分)在这里不可用。

如果我实现了IDispatchMessageInspector,我可以访问Message对象,但不能访问输入参数/动作(技术上我做的很好,但这对他们来说并不是一件容易的事)。我真的想使用BeforeCall的{​​{1}}功能,因为它不需要对消息的架构进行任何假设。

我可能会遗漏一些非常简单的东西,但似乎两者 IParameterInspector并且同一范围内的输入参数并不容易。

合并MessageIdBeforeCall,或至少在这两种方法之间传递数据,将是完美的。

2 个答案:

答案 0 :(得分:0)

您可以在IParameterInspector中使用类似的内容:

OperationContext.Current.IncomingMessageHeaders.MessageId

答案 1 :(得分:0)

请参阅链接WCF Unique ID for each service method call

另一种选择是在afterRecieveRequest

中添加messageproperty
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
       {

Guid activityId = Guid.NewGuid();
            System.ServiceModel.OperationContext.Current.IncomingMessageProperties.Add("LOGID", activityId);
//log your messages here

return activityId 

}

public void BeforeSendReply(ref Message reply, object correlationState)
       {
            Guid activityId = (Guid)correlationState;
//Log your Message here..
}

在服务请求的实际功能中,您可以访问此属性

 public String SayHello(String request)
            {
                object activityId;
                System.ServiceModel.OperationContext.Current.IncomingMessageProperties.TryGetValue("LOGID", out activityId);

    //log your messages here with this ID....

Return "Hello, World";
    }