Настройка отслеживания потока сообщений
Если трассировка действий 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()));