Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом разделе описывается передача в модели трассировки действий Windows Communication Foundation (WCF).
Определение передачи
Передача между действиями представляет собой причинно-следственные связи между событиями в связанных действиях на конечных точках взаимодействия. Две операции связаны с передачей данных, когда потоки управления переходят между этими операциями, например, вызов метода, проходящий через границы операций. В WCF, когда байты поступают на сервис, действие "Прослушивание" передается действию "Получение байтов", в котором создается объект сообщения. Список сквозных сценариев трассировки и их соответствующего поведения и проектирования трассировки см. в разделе "Сквозные сценарии трассировки".
Чтобы излучать следы передачи, используйте настройку ActivityTracing в источнике трассировки, как показано в следующем конфигурационном коде.
<source name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
Использование передачи для сопоставления действий в конечных точках
Действия и передачи позволяют пользователю вероятностно находить первопричину ошибки. Например, если мы перемещаемся туда-сюда между действиями M и N в рамках компонентов M и N, а аварийное завершение происходит в N сразу после обратной передачи на M, мы можем сделать вывод о том, что это, вероятно, из-за передачи данных N обратно в M.
Трассировка передачи создается из действия M в действие N при наличии потока управления между M и N. Например, N выполняет некоторую работу для M из-за вызова метода, пересекающего границы действий. N может уже существовать или создан. N порождается M, когда N является новым действием, которое выполняет некоторую работу для M.
За передачей с M на N может не следовать передача обратно с N на M. Это связано с тем, что M может создать некоторую работу в N и не отслеживать, когда N завершает эту работу. На самом деле, M может завершить работу, прежде чем N завершит свою задачу. Это происходит в действии Open ServiceHost (M), которое создает действия прослушивателя (N), а затем завершает работу. Обратная передача с N на M означает, что N завершил работу, связанную с M.
N может продолжать выполнять другую обработку, не связанную с M, например существующее действие аутентификатора (N), которое сохраняет получение запросов на вход (M) из разных действий входа.
Отношение вложенности не обязательно существует между действиями M и N. Это может быть вызвано двумя причинами. Во-первых, когда действие M не отслеживает реальную обработку, выполняемую в N, хотя M инициировал N; во-вторых, когда N уже существует.
Пример трансферов
Ниже перечислены два примера трансфера.
При создании узла службы конструктор получает контроль от вызывающего кода или это управление передается конструктору. По завершении выполнения конструктора, управление возвращается вызывающему коду, или конструктор передает управление обратно в вызывающий код. Это пример вложенной связи.
Когда прослушиватель начинает обработку транспортных данных, он создает новый поток и передает действию "Получение байтов" соответствующий контекст для обработки, управления и передачи данных. Когда этот поток завершит обработку запроса, действие получения байтов не передает ничего обратно прослушивателю. В этом случае у нас есть перенос в активность нового потока, но нет переноса из неё. Эти два действия связаны, но не включенные друг в друга.
Последовательность передачи действий
Хорошо сформированная последовательность передачи действий включает следующие шаги.
Начните новое действие, состоящее из выбора нового gAId.
Выпустите трассировку передачи в новый gAId из текущего идентификатора активности.
Установка нового идентификатора в TLS
Выведите начальную трассировку, чтобы указать начало нового действия.
Возврат к исходному действию состоит из следующих элементов:
Укажите трассировку передачи на исходный gAId
Выведите сигнал завершения, чтобы указать конец нового действия
Задайте для TLS старый gAId.
В следующем примере кода показано, как это сделать. В этом примере предполагается, что при переходе к новой активности выполняется блокирующий вызов, и включаются трассировки приостановки и возобновления.
// 0. Create a trace source
TraceSource ts = new TraceSource("myTS");
// 1. remember existing ("ambient") activity for clean up
Guid oldGuid = Trace.CorrelationManager.ActivityId;
// this will be our new activity
Guid newGuid = Guid.NewGuid();
// 2. call transfer, indicating that we are switching to the new AID
ts.TraceTransfer(667, "Transferring.", newGuid);
// 3. Suspend the current activity.
ts.TraceEvent(TraceEventType.Suspend, 667, "Suspend: Activity " + i-1);
// 4. set the new AID in TLS
Trace.CorrelationManager.ActivityId = newGuid;
// 5. Emit the start trace
ts.TraceEvent(TraceEventType.Start, 667, "Boundary: Activity " + i);
// trace something
ts.TraceEvent(TraceEventType.Information, 667, "Hello from activity " + i);
// Perform Work
// some work.
// Return
ts.TraceEvent(TraceEventType.Information, 667, "Work complete on activity " + i);
// 6. Emit the transfer returning to the original activity
ts.TraceTransfer(667, "Transferring Back.", oldGuid);
// 7. Emit the End trace
ts.TraceEvent(TraceEventType.Stop, 667, "Boundary: Activity " + i);
// 8. Change the tls variable to the original AID
Trace.CorrelationManager.ActivityId = oldGuid;
// 9. Resume the old activity
ts.TraceEvent(TraceEventType.Resume, 667, "Resume: Activity " + i-1);