ПереносTransfer

В этом разделе описывается перемещение в модели трассировки действий Windows Communication Foundation (WCF).This topic describes transfer in the Windows Communication Foundation (WCF) activity tracing model.

Определение перенаправленияTransfer Definition

Перенаправления между действиями передают причинно-следственную связь между событиями в связанных действиях внутри конечных точек.Transfers between activities represent causal relationships between events in the related activities within endpoints. Два действия связываются перенаправлениями при потоке управления от одного из этих действий к другому, например когда вызов метода пересекает границы действия.Two activities are related with transfers when control flows between these activities, for example, a method call crossing activity boundaries. В WCF, когда в службе поступают байты, действие Listen on передается в действие Receive Bytes, где создается объект Message.In WCF, when bytes are incoming on the service, the Listen At activity is transferred to the Receive Bytes activity where the message object is created. Список комплексных сценариев трассировки и их соответствующих действий и структуры трассировки см. в разделе Сценарии сквозной трассировки.For a list of end-to-end tracing scenarios, and their respective activity and tracing design, see End-To-End Tracing Scenarios.

Для выдачи трассировки перенаправлений задайте параметр ActivityTracing в источнике трассировки, как показано в предыдущем примере кода.To emit transfer traces, use the ActivityTracing setting on the trace source as demonstrated by the following configuration code.

<source name="System.ServiceModel" switchValue="Verbose,ActivityTracing">  

Использование перенаправления для корреляции действий внутри конечных точекUsing Transfer to Correlate Activities Within Endpoints

Действия и перенаправления позволяют пользователю с определенной вероятностью найти первопричину ошибки.Activities and transfers permit the user to probabilistically locate the root cause of an error. Например, если при перенаправлении от действия M на действие N и обратно (в компонентах M и N соответственно) сразу же после перенаправления обратно на M происходит сбой, можно сделать вывод, что это скорее всего связано с передачей действием N данных обратно действию M.For example, if we transfer back and forth between activities M and N respectively in components M and N, and a crash happens in N right after the transfer back to M, we can draw the conclusion that it is likely due to N’s passing data back to M.

Трассировка перенаправления выдается от действия M на действие N при передаче управления от M к N. Например, N выполняет некоторую обработку для M в связи с тем, что вызов метода пересекает границы действий.A transfer trace is emitted from activity M to activity N when there is a flow of control between M and N. For example, N performs some work for M because of a method call crossing the activities’ boundaries. Действие N может уже существовать или быть создано.N may already exist or has been created. Действие N порождается действием M, когда N представляет собой новое действие, выполняющее некоторую обработку для M.N is spawned by M when N is a new activity that performs some work for M.

За перенаправлением от M на N не обязательно следует перенаправление обратно от N на M. Это связано с тем, что M может породить некоторую обработку в N и не следит за тем, когда N завершит эту обработку.A transfer from M to N may not be followed by a transfer back from N to M. This is because M can spawn some work in N and do not track when N completes that work. Фактически действие M может быть прекращено до того, как N завершит свою задачу.In fact, M can terminate before N completes its task. Это происходит в действии Open ServiceHost (M), которое порождает действия прослушивателя (N) и затем завершается.This happens in the "Open ServiceHost" activity (M) that spawns Listener activities (N) and then terminates. Перенаправление обратно от N на M означает, что действие N завершило обработку, относящуюся к действию M.A transfer back from N to M means that N completed the work related to M.

Действие N может продолжать выполнять другую обработку, не относящуюся к действию M, например существующее действие структуры проверки подлинности (N) продолжит получать запросы на вход (M) от других действий входа.N can continue performing other processing unrelated to M, for example, an existing authenticator activity (N) that keeps receiving login requests (M) from different login activities.

Между действиями M и N необязательно должно существовать отношение вложенности. Это может произойти по двум причинам.A nesting relationship does not necessarily exist between activities M and N. This can happen due to two reasons. Первая — когда действие M не осуществляет мониторинг обработки, выполняемой действием N, даже хотя действие M инициировало действие N. Вторая — когда действия N уже существует.First, when activity M does not monitor the actual processing performed in N although M initiated N. Second, when N already exists.

Пример перенаправленияExample of Transfers

Ниже приведено два примера перенаправления.The following lists two transfer examples.

  • При создании узла службы конструктор получает управление от вызывающего кода, или вызывающий код выполняет перенаправление на конструктор.When you create a service host, the constructor gains control from the calling code, or the calling code transfers to the constructor. По завершении выполнения конструктор возвращает управление вызывающему коду, или конструктор выполняет перенаправление обратно на вызывающий код.When the constructor has finished executing, it returns control to the calling code, or the constructor transfers back to the calling code. Это случай отношения вложенности.This is the case of a nested relationship.

  • Когда прослушиватель начинает обрабатывать данные транспорта, он создает новый поток и передает действию Receive Bytes соответствующий контекст для обработки, т. е. передает управление и данные.When a listener starts processing transport data, it creates a new thread and hands to the Receive Bytes activity the appropriate context for processing, passing control and data. По завершении обработки запроса этим потоком действие Receive Bytes ничего не передает обратно прослушивателю.When that thread has finished processing the request, the Receive Bytes activity passes nothing back to the listener. В этом случае имеет место перенаправление на новое действие потока, однако перенаправления от действия потока не происходит.In this case, we have a transfer in but no transfer out of the new thread activity. Два действия связаны, но не являются вложенными.The two activities are related but not nested.

Последовательность перенаправления между действиямиActivity Transfer Sequence

Корректная последовательность перенаправления между действиями включает следующие шаги.A well-formed activity transfer sequence includes the following steps.

  1. Начало нового действия (заключается в выборе нового идентификатора gAId).Begin a new activity, which consists of selecting a new gAId.

  2. Выдача трассировки перенаправления на этот новый идентификатор gAId от текущего идентификатора действия.Emit a transfer trace to that new gAId from the current activity ID

  3. Задание нового идентификатора в локальной памяти потока.Set the new ID in TLS

  4. Выдача трассировки Start, обозначающей начало нового действия.Emit a start trace to indicate the beginning of the new activity by.

  5. Возврат к исходному действию заключается в следующем:Return to the original activity consists of the following:

  6. выдача трассировки перенаправления к исходному идентификатору gAId;Emit a transfer trace to the original gAId

  7. выдача трассировки Stop, обозначающей конец нового действия;Emit a Stop trace to indicate the end of the new activity

  8. присвоение локальной памяти потока старого идентификатора gAId.Set TLS to the old gAId.

В следующем примере кода показано, как это сделать.The following code example demonstrates how to do this. В этом примере предполагается, что при перенаправлении на новое действие совершается блокирующий вызов, и приводятся трассировки приостановки/возобновления.This sample assumes a blocking call is made when transferring to the new activity, and includes suspend/resume traces.

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

См. такжеSee also