作为我的WCF服务的一部分,我想使用请求的操作和提供的输入参数记录传入/传出呼叫。
我还想在相同的日志行中记录请求的MessageId
。 IParameterInspector
看起来很完美,但是MessageId
(消息请求对象的一部分)在这里不可用。
如果我实现了IDispatchMessageInspector
,我可以访问Message对象,但不能访问输入参数/动作(技术上我做的很好,但这对他们来说并不是一件容易的事)。我真的想使用BeforeCall
的{{1}}功能,因为它不需要对消息的架构进行任何假设。
我可能会遗漏一些非常简单的东西,但似乎两者 IParameterInspector
并且同一范围内的输入参数并不容易。
合并MessageId
和BeforeCall
,或至少在这两种方法之间传递数据,将是完美的。
答案 0 :(得分:0)
您可以在IParameterInspector中使用类似的内容:
OperationContext.Current.IncomingMessageHeaders.MessageId
答案 1 :(得分:0)
请参阅链接WCF Unique ID for each service method call
另一种选择是在afterRecieveRequest
中添加messagepropertypublic 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";
}