本主题介绍 Windows Communication Foundation (WCF) 跟踪模型中的活动传播。
使用传播关联终结点之间的活动
传播可向用户提供应用程序终结点之间相同处理单元的错误跟踪的直接关联,如请求。 在不同终结点为相同处理单元发出的错误将被分组到相同的活动中,甚至跨应用程序域。 这是通过传播消息标头中的活动 ID 来完成的。 因此,如果客户端因为服务器内部错误而导致超时,这两个错误会出现在同一个活动中,以便实现直接关联。
为此,请使用 ActivityTracing 上一示例中所示的设置。 此外,应在所有终结点上为propagateActivity跟踪源设置System.ServiceModel属性。
<source name="System.ServiceModel" switchValue="Verbose,ActivityTracing" propagateActivity="true" >
活动传播是一种可配置的功能,可导致 WCF 向出站消息添加标头,其中包括 TLS 上的活动 ID。 通过在服务器端的后续跟踪中包括此信息,我们可以关联客户端和服务器活动。
传播定义
如果满足以下所有条件,活动 M 的 gAId 将传播到活动 N。
N 是由于 M 而创建的
N 已知 M 的 gAId
N 的 gAId 等于 M 的 gAId。
gAId 通过 ActivityId 消息标头传播,如以下 XML 架构所示。
<xsd:element name="ActivityId" type="integer" minOccurs="0">
<xsd:attribute name="CorrelationId" type="integer" minOccurs="0"/>
</xsd:element>
下面是消息标头的示例。
<MessageLogTraceRecord>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"
xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
<a:Action s:mustUnderstand="1">http://Microsoft.ServiceModel.Samples/ICalculator/Subtract
</a:Action>
<a:MessageID>urn:uuid:f0091eae-d339-4c7e-9408-ece34602f1ce
</a:MessageID>
<ActivityId CorrelationId="aaaa0000-bb11-2222-33cc-444444dddddd"
xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">
17f59a29-b435-4a15-bf7b-642ffc40eac8
</ActivityId>
<a:ReplyTo>
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
</a:ReplyTo>
<a:To s:mustUnderstand="1">net.tcp://localhost/servicemodelsamples/service</a:To>
</s:Header>
<s:Body>
<Subtract xmlns="http://Microsoft.ServiceModel.Samples">
<n1>145</n1>
<n2>76.54</n2>
</Subtract>
</s:Body>
</s:Envelope>
</MessageLogTraceRecord>
传播和活动边界
当活动 ID 在终结点之间传播时,消息接收方使用该(传播的)活动 ID 发出开始跟踪和停止跟踪。 因此,每个跟踪源的 gAId 都具有开始和停止跟踪。 如果终结点在同一进程中并使用同一跟踪源名称,则会生成多个具有相同 lAId 的启动和停止事件(同一 gAId、同一跟踪源、同一进程)。
同步
为了同步不同计算机上运行的各终结点之间的事件,向在消息中传播的 ActivityId 标头中添加了一个 CorrelationId。 工具可以使用此 ID 在存在时钟差异的情况下跨计算机同步事件。 具体而言,服务跟踪查看器工具使用此 ID 来显示终结点之间的消息流。