Compartilhar via


Propagação de ID de atividade

A propagação ocorre quando o rastreamento de atividade ServiceModel está habilitado (propagação serviceModel) ou desabilitado (propagação de atividade de usuário para usuário).

O rastreamento de atividade serviceModel está habilitado

Se ServiceModel ActivityTracing estiver habilitado, a propagação ocorrerá entre as atividades do ProcessAction.

Servidor

Quando o atributo propagateActivity é definido como true no cliente e no servidor, a ID da atividade ProcessAction no servidor é idêntica à ID no cabeçalho da mensagem propagada ActivityId.

Quando nenhum cabeçalho ActivityId está presente na mensagem (ou seja, propagateActivity=false no cliente) ou quando propagateActivity=false no servidor, o servidor gera uma nova ID de atividade.

Cliente

Se o cliente estiver em thread único de maneira síncrona, ele desconsiderará as configurações do propagateActivity no cliente ou servidor. Em vez disso, a resposta é tratada na atividade de solicitação. Se o cliente for multithread assíncrono ou síncrono, propagateActivity=true no cliente e houver um cabeçalho de ID de atividade na mensagem enviada pelo servidor, o cliente recuperará a ID da atividade da mensagem e será transferido para a atividade Ação de processo que contém a ID da atividade propagada. Caso contrário, o cliente será transferido da atividade de Mensagem de processo para uma nova atividade de Ação de processo. Essa transferência extra para uma nova atividade de Ação de Processo é feita para fins de consistência. Dentro dessa atividade, o cliente recupera a ID de atividade da atividade BeginCall do contexto de thread local, quando o thread é alocado para processamento de mensagens de resposta. Em seguida, ele é transferido para a atividade inicial de Ação de processo.

Se o cliente for duplex, ele atuará como servidor ao receber a mensagem.

Propagação em mensagens com falha

Não há diferença no tratamento de mensagens válidas e com falha. Se propagateActivity=true, a ID da atividade adicionada aos cabeçalhos de mensagem de falha SOAP será idêntica à atividade de ambiente.

O rastreamento de atividade ServiceModel está desabilitado

Se ServiceModel ActivityTracing estiver desabilitado, a propagação ocorrerá entre as atividades de código do usuário diretamente sem passar pelas atividades de ServiceModel. Uma ID de atividade definida pelo usuário também é propagada por meio do cabeçalho da ID da atividade de mensagem.

Se propagateActivity=true e ActivityTracing=off para um ouvinte de rastreamento ServiceModel (sem importar se o rastreamento está habilitado no ServiceModel), o seguinte ocorrerá no cliente ou no servidor:

  • Na solicitação de operação ou no envio de resposta, a ID de atividade no TLS é propagada para fora do código do usuário até que uma mensagem seja formada. Um cabeçalho de ID de atividade também é inserido na mensagem antes de ser enviado.

  • Ao receber uma solicitação ou uma resposta, a ID da atividade é recuperada do cabeçalho da mensagem assim que o objeto de mensagem recebido é criado. A ID de atividade no TLS é propagada assim que a mensagem desaparece do escopo até que o código do usuário seja atingido.

Essas ações garantem que os rastreamentos do usuário sejam exibidos na mesma atividade se a propagação estiver ativada. No entanto, ele não garante rastreamentos ServiceModel. Os rastreamentos ServiceModel ocorrem em uma atividade de código do usuário somente se o processamento desses rastreamentos for executado no mesmo thread em que a atividade de código do usuário foi definida.

Em geral, os rastreamentos ServiceModel podem ser observados nos seguintes locais:

  • Se o rastreamento ServiceModel estiver desabilitado, todos os rastreamentos emitidos aparecerão nas atividades do usuário. Se a propagação estiver habilitada no servidor e no cliente, esses rastreamentos estarão na mesma atividade.

  • Se o rastreamento ServiceModel estiver habilitado, mas o ActivityTracing estiver desabilitado, os rastreamentos do usuário aparecerão na mesma atividade se a propagação estiver habilitada em ambas as extremidades. Os rastreamentos ServiceModel aparecem na atividade padrão 0000, a menos que ocorram no mesmo thread que o processamento de código do usuário em que a atividade é definida inicialmente.

  • Se o rastreamento ServiceModel e o ActivityTracing estiverem habilitados, os rastreamentos de usuário aparecerão em atividades definidas pelo usuário e os rastreamentos ServiceModel aparecerão em atividades definidas pelo ServiceModel. A propagação ocorre no nível do ServiceModel.