将相关令牌传递给WCF服务?

时间:2011-09-26 09:06:18

标签: wcf logging correlation

对某些Web服务进行了大量类似的调用,可能是并行调用,我想知道实现相关令牌机制的最佳方法是什么。

我们的想法是从客户端到服务器,使用标识符记录单个请求的信息,以便稍后获取特定请求的日志。

我想避免在每个操作上添加一个参数,因为我认为这是管道,而不是业务。

PS:我在我的解决方案中控制客户端和服务器端。我可以改变任何需要的东西。我的服务正在运行.Net V4,我正在使用log4net来创建日志。我已经包装了log4net,这是我可以根据需要改变的一些实用方法。

1 个答案:

答案 0 :(得分:3)

那么您只想要有关请求及其响应的信息吗?如果您使用带有WS-Addressing的消息版本,则应自动拥有它,因为每条消息都将包含其自动生成的ID(guid),并且每个响应也将包含请求的ID。您可以通过OperationContext

访问这些标头

服务器端:

UniqueId id = OperationContext.Current.IncomingMessageHeaders.MessageId;

客户方:

using (var scope = new OperationContextScope())
{
    // Do call to server and after that access headers

    OperationContext context = OperationContext.Current;
    UniqueId responseId = context.IncomingMessageHeaders.MessageId;
    UniqueId requestId = context.IncomingMessageHeaders.RelatesTo;
}

要使用WS-Addressing,您必须在WsHttpBinding中使用CustomBindingMessageVersion使用SOAP服务。

如果要对来自同一客户端的所有请求进行关联,则需要WCF会话并使用会话ID(TextMessageEncodingBindingElement)。