配置消息流跟踪
启用 Windows Communication Foundation (WCF) 活动跟踪后,系统会将端对端活动 ID 分配到整个 WCF 堆栈中的逻辑活动。 在 .NET Framework 4.6.1 中,此功能现在具备性能更高的版本。它与 Windows 事件跟踪 (ETW) 一起使用,称为消息流跟踪。 启用此功能时,端对端活动 ID 取自(如果为空,则分配到)传入消息,并传播到在通道解码消息之后发出的所有跟踪事件。 客户通过此功能,可以在解码来自不同服务的跟踪日志后重新构造消息流。
检测到应用程序存在问题后,可以启用跟踪,然后在解决问题之后立即禁用跟踪。
启用跟踪
通过将 .NET Framework 4 messageFlowTracing
配置元素设置为 true
,可以启用消息流跟踪,如下面的示例所示。
<system.servicemodel>
<diagnostics>
<endToEndTracing propagateActivity="true" messageFlowTracing="true" />
</diagnostics>
</system.servicemodel>
注意
由于 endToEndTracing
配置元素驻留在 Web.config 文件中,因此不能采用与 ETW 一样的方法来动态配置该配置元素。 若要使 endToEndTracing
配置元素生效,必须回收应用程序。
活动通过一个标识符(称为活动 ID)的交换进行关联。 此标识符是 GUID,由 System.Diagnostics.CorrelationManager 类生成。 如果你操作 System.Diagnostics.Trace.CorrelationManager.ActivityID,请确保在执行控制传输回 WCF 代码时,值设置为原始值。 此外,如果您使用异步 WCF 编程模型,请确保在线程之间传输 System.Diagnostics.Trace.CorrelationManager.ActivityID。
消息流跟踪和 REST 服务
消息流跟踪使您能够端对端跟踪请求。 借助于基于 SOAP 的服务,将在 SOAP 消息标头中发送活动 ID。 REST 请求不包含此标头,因此改用特殊的 HTTP 事件标头。 下面的代码段演示如何以编程方式检索活动 ID的值:
Object output = null;
if (OperationContext.Current.IncomingMessageProperties.TryGetValue(HttpRequestMessageProperty.Name, out output))
{
HttpRequestMessageProperty httpHeaders = output as HttpRequestMessageProperty;
// Retrieve the Activity Id from the HTTP header string e2eId = httpHeaders.Headers["E2EActivity"];
// ...
}
你可以使用下面的代码,以编程方式添加标头:
HttpContent content = new StreamContent(contentStream);
Guid correlation = Guid.NewGuid();
content.Headers.Add("E2EActivity", Convert.ToBase64String(correlation.ToByteArray()));