对某些Web服务进行了大量类似的调用,可能是并行调用,我想知道实现相关令牌机制的最佳方法是什么。
我们的想法是从客户端到服务器,使用标识符记录单个请求的信息,以便稍后获取特定请求的日志。
我想避免在每个操作上添加一个参数,因为我认为这是管道,而不是业务。
PS:我在我的解决方案中控制客户端和服务器端。我可以改变任何需要的东西。我的服务正在运行.Net V4,我正在使用log4net来创建日志。我已经包装了log4net,这是我可以根据需要改变的一些实用方法。
答案 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
中使用CustomBinding
或MessageVersion
使用SOAP服务。
如果要对来自同一客户端的所有请求进行关联,则需要WCF会话并使用会话ID(TextMessageEncodingBindingElement
)。