Compartilhar via


Transferência

Este tópico descreve a transferência no modelo de rastreamento de atividade do WCF (Windows Communication Foundation).

Definição de transferência

As transferências entre atividades representam relações causais entre eventos nas atividades relacionadas nos pontos de extremidade. Duas atividades estão relacionadas com transferências quando o controle flui entre essas atividades, por exemplo, uma chamada de método cruzando limites de atividade. No WCF, quando os bytes estão entrando no serviço, a atividade Listen At é transferida para a atividade Receive Bytes em que o objeto de mensagem é criado. Para obter uma lista de cenários de rastreamento de ponta a ponta e suas respectivas atividades e design de rastreamento, consulte Cenários de rastreamento de ponta a ponta.

Para emitir rastreamentos de transferência, use a configuração ActivityTracing na fonte de rastreamento, conforme demonstrado pelo código de configuração a seguir.

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

Usar a transferência para correlacionar atividades em pontos de extremidade

Atividades e transferências permitem que o usuário localize probabilisticamente a causa raiz de um erro. Por exemplo, se transferirmos para frente e para trás entre as atividades M e N, respectivamente, nos componentes M e N, e uma falha ocorrer em N logo após a transferência de volta para M, podemos tirar a conclusão de que provavelmente é devido à passagem de dados de N de volta para M.

Um rastreamento de transferência é emitido da atividade M para a atividade N quando há um fluxo de controle entre M e N. Por exemplo, N executa algum trabalho para M devido a uma chamada de método que ultrapassa os limites das atividades. N já pode já existir ou foi criado. N é gerado por M quando N é uma nova atividade que executa algum trabalho para M.

Uma transferência de M para N pode não ser seguida por uma transferência de volta de N para M. Isso ocorre porque M pode gerar algum trabalho em N e não acompanhar quando N concluir esse trabalho. Na verdade, M pode terminar antes que N conclua sua tarefa. Isso acontece na atividade "Open ServiceHost" (M) que gera atividades de Ouvinte (N) e termina. Uma transferência de N para M significa que N concluiu o trabalho relacionado a M.

N pode continuar executando outros processamentos não relacionados a M, por exemplo, uma atividade de autenticador existente (N) que continua recebendo solicitações de logon (M) de diferentes atividades de logon.

Uma relação de aninhamento não existe necessariamente entre as atividades M e N. Isso pode acontecer por dois motivos. Primeiro, quando a atividade M não monitora o processamento real executado em N, embora M tenha iniciado N. Segundo, quando N já existe.

Exemplo de transferências

As listas a seguir listam dois exemplos de transferência.

  • Quando você cria um host de serviço, o construtor obtém o controle do código de chamada ou o código de chamada é transferido para o construtor. Quando o construtor terminar de executar, ele retornará o controle para o código de chamada ou o construtor será transferido de volta para o código de chamada. Esse é o caso de uma relação aninhada.

  • Quando um ouvinte inicia o processamento de dados de transporte, ele cria um novo thread e entrega à atividade Receive Bytes o contexto apropriado para processamento, passagem de controle e dados. Quando esse thread terminar de processar a solicitação, a atividade Receive Bytes não passará nada de volta para o ouvinte. Nesse caso, temos uma transferência, mas nenhuma transferência da nova atividade de thread. As duas atividades estão relacionadas, mas não aninhadas.

Sequência de transferência de atividade

Uma sequência de transferência de atividade bem formada inclui as etapas a seguir.

  1. Inicie uma nova atividade, que consiste em selecionar um novo gAId.

  2. Emitir um rastreamento de transferência para esse novo gAId da ID da atividade atual

  3. Definir a nova ID no TLS

  4. Emita um rastreamento inicial para indicar o início da nova atividade.

  5. O retorno à atividade original consiste no seguinte:

  6. Emitir um rastreamento de transferência para o gAId original

  7. Emitir um rastreamento Parar para indicar o fim da nova atividade

  8. Defina o TLS como o gAId antigo.

O exemplo de código a seguir demonstra como fazer isso. Este exemplo pressupõe que uma chamada de bloqueio seja feita durante a transferência para a nova atividade e inclui rastreamentos de suspensão/retomada.

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

Confira também