Compartilhar via


Configurando rastreamento de fluxo de mensagem

Quando o rastreamento de atividade do WCF (Windows Communication Foundation) está habilitado, as IDs de atividade de ponta a ponta são atribuídas a atividades lógicas em toda a pilha WCF. No .NET Framework 4.6.1, agora há uma versão de maior desempenho desse recurso que funciona com o ETW (Rastreamento de Eventos para Windows) chamado rastreamento de fluxo de mensagens. Quando habilitadas, as IDs de atividade de ponta a ponta são retiradas (ou atribuídas a mensagens de entrada, se vazias) e são propagadas para todos os eventos de rastreamento emitidos após a mensagem ter sido decodificada pelo canal. Os clientes podem usar esse recurso para reconstruir fluxos de mensagens com logs de rastreamento de diferentes serviços após a decodificação.

O rastreamento pode ser ativado se um problema for detectado com o aplicativo e desativado novamente assim que o problema for resolvido.

Habilitar o rastreamento

Você pode habilitar o rastreamento de fluxo de mensagens definindo o elemento de configuração messageFlowTracing do .NET Framework 4 como true, conforme mostrado no exemplo a seguir.

<system.servicemodel>  
  <diagnostics>  
    <endToEndTracing propagateActivity="true" messageFlowTracing="true" />  
  </diagnostics>  
</system.servicemodel>  

Observação

Como o elemento de configuração endToEndTracing reside em um arquivo Web.config, ele não pode ser configurado dinamicamente da mesma maneira que o ETW. Para que o elemento de configuração endToEndTracing entre em vigor, o aplicativo deve ser reciclado.

As atividades são correlacionadas pelo intercâmbio de um identificador chamado ID da atividade. Esse identificador é um GUID e é gerado pela classe System.Diagnostics.CorrelationManager. Se você manipular System.Diagnostics.Trace.CorrelationManager.ActivityID, verifique se o valor é definido como original quando o controle de execução for transferido de volta para o código WCF. Além disso, se você usar um modelo assíncrono de programação WCF, verifique se System.Diagnostics.Trace.CorrelationManager.ActivityID é transferido entre os threads.

Rastreamento de fluxo de mensagens e serviços REST

O rastreamento de fluxo de mensagens permite rastrear uma solicitação de ponta a ponta. Com os serviços baseados em SOAP, uma ID de Atividade é enviada em um cabeçalho de mensagem SOAP. As solicitações REST não contêm esse cabeçalho para que um cabeçalho de evento HTTP especial seja usado. O snippet de código a seguir mostra como você pode recuperar programaticamente o valor da ID da atividade:

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"];
   // ...
}

Você pode adicionar programaticamente o cabeçalho usando o seguinte código:

HttpContent content = new StreamContent(contentStream);  
Guid correlation = Guid.NewGuid();  
content.Headers.Add("E2EActivity", Convert.ToBase64String(correlation.ToByteArray()));