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


Передать

В этом разделе описывается передача в модели трассировки действий 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 уже существует.

Пример трансферов

Ниже перечислены два примера трансфера.

  • При создании узла службы конструктор получает контроль от вызывающего кода или это управление передается конструктору. По завершении выполнения конструктора, управление возвращается вызывающему коду, или конструктор передает управление обратно в вызывающий код. Это пример вложенной связи.

  • Когда прослушиватель начинает обработку транспортных данных, он создает новый поток и передает действию "Получение байтов" соответствующий контекст для обработки, управления и передачи данных. Когда этот поток завершит обработку запроса, действие получения байтов не передает ничего обратно прослушивателю. В этом случае у нас есть перенос в активность нового потока, но нет переноса из неё. Эти два действия связаны, но не включенные друг в друга.

Последовательность передачи действий

Хорошо сформированная последовательность передачи действий включает следующие шаги.

  1. Начните новое действие, состоящее из выбора нового gAId.

  2. Выпустите трассировку передачи в новый gAId из текущего идентификатора активности.

  3. Установка нового идентификатора в TLS

  4. Выведите начальную трассировку, чтобы указать начало нового действия.

  5. Возврат к исходному действию состоит из следующих элементов:

  6. Укажите трассировку передачи на исходный gAId

  7. Выведите сигнал завершения, чтобы указать конец нового действия

  8. Задайте для 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);  

См. также