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.