2011-09-26 93 views
4

有许多类似的调用,也许并行,对一些Web服务,我想知道什么是实现相关令牌机制的最佳方式。将相关令牌传递给WCF服务?

这个想法是从客户端到服务器,有一个标识符记录信息的能力,这个标识符有助于稍后获取特定请求的日志。

我想避免在每个操作中添加一个参数,因为我认为这是管道,而不是业务。 PS:我在我的解决方案中控制客户端和服务器端。我可以改变任何需要的东西。我的服务使用.Net V4运行,我使用log4net创建日志。我已经包装log4net是一些实用的方法,我可以根据需要进行更改。

回答

3

那么你只需要关于请求和响应的信息?如果您使用消息版本WS-Addressing,您应该自动拥有该消息,因为每条消息都将包含其自动生成的标识(guid),并且每个响应也会包含该请求的标识。您可以通过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,你必须使用SOAP服务WsHttpBindingCustomBinding使用正确MessageVersionTextMessageEncodingBindingElement

如果您希望来自同一客户端的所有请求具有相关性,则需要使用WCF会话并使用会话Id(OperationContext.Current.SessionId)。

+0

thx :)这正是我想要做的。一点封装,我的日志将与这个ID饲料。 –