Propagação de ID de atividade
A propagação acontece 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 acontecerá entre as atividades ProcessAction.
Servidor
Quando o propagateActivity
atributo é definido como true
no cliente e no servidor, o ID da ProcessAction
atividade no servidor é idêntico ao ID no cabeçalho da mensagem propagada ActivityId
.
Quando nenhum ActivityId
cabeçalho está presente na mensagem (ou seja,=propagateActivity
false
no cliente), ou quando propagateActivity
=false
no servidor, o servidor gera um novo ID de atividade.
Cliente
Se o cliente for síncrono de thread único, o cliente desconsidera quaisquer configurações de 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á o ID de atividade da mensagem e transferirá para a atividade Process Action que contém o ID de atividade propagada. Caso contrário, o cliente transfere da atividade 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 consistência. Dentro dessa atividade, o cliente recupera o 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 do Processo.
Se o cliente for duplex, o cliente atuará como servidor ao receber a mensagem.
Propagação em mensagens de falha
Não há diferença no tratamento de mensagens válidas e de falha. Se propagateActivity
=true
, o ID da atividade adicionado aos cabeçalhos da mensagem de falha SOAP for idêntico à atividade ambiente.
O rastreamento de atividade ServiceModel está desativado
Se ServiceModel ActivityTracing estiver desabilitado, a propagação ocorrerá entre as atividades de código do usuário diretamente sem passar pelas atividades ServiceModel. Um ID de atividade definido pelo usuário também é propagado através do cabeçalho do ID de atividade da mensagem.
Se propagateActivity
=true
e ActivityTracing
=off
para um ouvinte de rastreamento ServiceModel (independentemente de o rastreamento estar habilitado no ServiceModel), o seguinte acontece no cliente ou servidor:
Na solicitação de operação ou no envio de resposta, o ID de atividade no TLS é propagado 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 enviada.
Ao receber solicitação ou resposta, o ID da atividade é recuperado do cabeçalho da mensagem assim que o objeto de mensagem recebida é criado. O ID de atividade no TLS é propagado assim que a mensagem desaparece do escopo até que o código do usuário seja alcançado.
Essas ações garantem que os rastreamentos do usuário apareçam na mesma atividade se a propagação estiver ativada. No entanto, ele não garante os rastreamentos do ServiceModel. Os rastreamentos ServiceModel ocorrem em uma atividade de código de usuário somente se o processamento desses rastreamentos for executado no mesmo thread em que a atividade de código de 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 de usuário aparecerão na mesma atividade se a propagação estiver habilitada em ambas as extremidades. Os rastreamentos ServiceModel aparecem na atividade 0000 padrão, a menos que ocorram no mesmo thread que o processamento de código do usuário onde 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 acontece no nível ServiceModel.