Ste*_*e B 6 wcf logging correlation
有很多类似的调用,也许是并行的,对一些 Web 服务,我想知道实现关联令牌机制的最佳方法是什么。
这个想法是让从客户端到服务器,能够使用标识符记录单个请求的信息,该标识符有助于稍后获取特定请求的日志。
我想避免在每个操作上添加一个参数,因为我认为这是管道,而不是业务。
PS:我在我的解决方案中同时控制客户端和服务器端。我可以改变任何需要的东西。我的服务使用 .Net V4 运行,我使用 log4net 创建日志。我已经包装了 log4net 是一些实用方法,如果需要,我可以更改。
那么您是否只想要有关请求及其响应的信息?如果您使用消息版本,WS-Addressing您应该自动拥有它,因为每条消息都将包含其自动生成的 ID (guid),并且每个响应也将包含请求的 ID。您可以通过以下方式访问这些标头OperationContext:
服务器端:
UniqueId id = OperationContext.Current.IncomingMessageHeaders.MessageId;
Run Code Online (Sandbox Code Playgroud)
客户端:
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;
}
Run Code Online (Sandbox Code Playgroud)
要使用的WS-Addressing必须使用SOAP服务,WsHttpBinding或者CustomBinding使用正确的MessageVersion在TextMessageEncodingBindingElement。
如果您想关联来自同一客户端的所有请求,您需要 WCF 会话并使用会话 ID ( OperationContext.Current.SessionId)。