有许多类似的调用,也许并行,对一些Web服务,我想知道什么是实现相关令牌机制的最佳方式。将相关令牌传递给WCF服务?
这个想法是从客户端到服务器,有一个标识符记录信息的能力,这个标识符有助于稍后获取特定请求的日志。
我想避免在每个操作中添加一个参数,因为我认为这是管道,而不是业务。 PS:我在我的解决方案中控制客户端和服务器端。我可以改变任何需要的东西。我的服务使用.Net V4运行,我使用log4net创建日志。我已经包装log4net是一些实用的方法,我可以根据需要进行更改。
有许多类似的调用,也许并行,对一些Web服务,我想知道什么是实现相关令牌机制的最佳方式。将相关令牌传递给WCF服务?
这个想法是从客户端到服务器,有一个标识符记录信息的能力,这个标识符有助于稍后获取特定请求的日志。
我想避免在每个操作中添加一个参数,因为我认为这是管道,而不是业务。 PS:我在我的解决方案中控制客户端和服务器端。我可以改变任何需要的东西。我的服务使用.Net V4运行,我使用log4net创建日志。我已经包装log4net是一些实用的方法,我可以根据需要进行更改。
那么你只需要关于请求和响应的信息?如果您使用消息版本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服务WsHttpBinding
或CustomBinding
使用正确MessageVersion
与TextMessageEncodingBindingElement
。
如果您希望来自同一客户端的所有请求具有相关性,则需要使用WCF会话并使用会话Id(OperationContext.Current.SessionId
)。
thx :)这正是我想要做的。一点封装,我的日志将与这个ID饲料。 –