Поделиться через


Настройка отслеживания потока сообщений

Если трассировка действий Windows Communication Foundation (WCF) включена, идентификаторы комплексных действий назначаются логическим действиям в стеке WCF. В платформа .NET Framework 4.6.1 теперь существует более высокая производительность этой функции, которая работает с трассировкой событий Windows (ETW), которая называется трассировкой потока сообщений. При ее включении полные идентификаторы действий извлекаются (или назначаются при их отсутствии) и распространяются для всех событий трассировки, которые создаются после того, как канал декодировал сообщение. Клиенты могут использовать эту функцию для воссоздания потоков сообщений с журналами трассировки от различных служб после декодирования.

Трассировку можно включить после обнаружения проблемы в работе приложения, а затем отключить после разрешения проблемы.

Включение трассировки

Чтобы включить трассировку потока сообщений, установите элемент конфигурации .NET Framework 4 messageFlowTracing в значение true, как показано в следующем примере.

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

Примечание

Поскольку элемент конфигурации endToEndTracing находится в файле Web.config, его нельзя динамично изменять таким же образом, как и трассировку событий Windows. Чтобы изменение параметра endToEndTracing вступило в силу, необходимо выполнить очистку приложения.

Действия связываются путем обмена идентификаторами действия. Эти идентификаторы являются идентификаторами GUID и формируются классом System.Diagnostics.CorrelationManager. При изменении идентификатора System.Diagnostics.Trace.CorrelationManager.ActivityID не забудьте вернуть идентификатору исходное значение, передавая управление обратно в код WCF. Кроме того, если используется асинхронная программная модель WCF, не забывайте передавать идентификатор System.Diagnostics.Trace.CorrelationManager.ActivityID между потоками.

Трассировка потока сообщений и службы REST

Трассировка потока сообщений позволяет выполнять сквозную трассировку запроса. В службах на основе SOAP идентификатор действия отправляется в заголовке сообщения SOAP. Запросы REST не содержат этот заголовок, поэтому взамен используется заголовок события HTTP. В следующем фрагменте кода показано, как можно программно получить значение идентификатора действия:

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()));