Ativando o fluxo de transações

O Windows Communication Foundation (WCF) fornece opções altamente flexíveis para controlar o fluxo de transação. As configurações de fluxo de transação de um serviço podem ser expressas usando uma combinação de atributos e configuração.

Configurações do fluxo de transação

As configurações de fluxo de transação são geradas para um ponto de extremidade de serviço como resultado de uma interseção dos três valores a seguir:

  • O atributo TransactionFlowAttribute especificado para cada método no contrato de serviço.

  • A propriedade de associação TransactionFlow na associação específica.

  • A propriedade de associação TransactionFlowProtocol na associação específica. A propriedade de associação TransactionFlowProtocol permite que você escolha entre dois protocolos de transação diferentes que você pode usar para fluir uma transação. As seções a seguir descrevem brevemente cada uma delas.

Protocolo WS-AtomicTransaction

O protocolo WS-AtomicTransaction (WS-AT) é útil para cenários em que a interoperabilidade com pilhas de protocolo de terceiros é necessária.

Protocolo OleTransactions

O protocolo OleTransactions é útil para cenários em que a interoperabilidade com pilhas de protocolo de terceiros não é necessária, e o implantador de um serviço sabe com antecedência que o serviço de protocolo WS-AT está desabilitado localmente ou a topologia de rede existente não favorece o uso do WS-AT.

A tabela a seguir mostra os diferentes tipos de fluxos de transação que podem ser gerados usando essas várias combinações.

TransactionFlow

associação
Propriedade de associação TransactionFlow Protocolo de associação TransactionFlowProtocol Tipo de fluxo de transação
Obrigatório true WS-AT A transação deve ser fluida no formato WS-AT interoperável.
Obrigatório true OleTransactions A transação deve ser fluida no formato OleTransactions do WCF.
Obrigatório false Não aplicável Não aplicável porque essa é uma configuração inválida.
Permitido true WS-AT A transação pode ser fluida no formato WS-AT interoperável.
Permitido true OleTransactions A transação pode ser fluida no formato OleTransactions do WCF.
Permitido false Qualquer valor Uma transação não flui.
NotAllowed Qualquer valor Qualquer valor Uma transação não flui.

A tabela a seguir resume o resultado do processamento da mensagem.

Mensagem de entrada Configuração do TransactionFlow Cabeçalho da transação Resultado do processamento da mensagem
Transação corresponde ao formato de protocolo esperado Permitido ou obrigatório MustUnderstand é igual a true. Processar
A transação não corresponde ao formato de protocolo esperado Obrigatório MustUnderstand é igual a false. Rejeitado porque uma transação é necessária
A transação não corresponde ao formato de protocolo esperado Permitido MustUnderstand é igual a false. Rejeitado porque o cabeçalho não é reconhecido
Transação usando qualquer formato de protocolo NotAllowed MustUnderstand é igual a false. Rejeitado porque o cabeçalho não é reconhecido
Nenhuma transação Obrigatório N/D Rejeitado porque uma transação é necessária
Nenhuma transação Permitido N/D Processar
Nenhuma transação NotAllowed N/D Processar

Embora cada método em um contrato possa ter requisitos de fluxo de transação diferentes, a configuração do protocolo de fluxo de transação tem o escopo no nível da associação. Isso significa que todos os métodos que compartilham o mesmo ponto de extremidade (e, portanto, a mesma associação) também compartilham a mesma política permitindo ou exigindo fluxo de transação, bem como o mesmo protocolo de transação, se aplicável.

Habilitando o fluxo de transação no nível do método

Os requisitos de fluxo de transação nem sempre são iguais para todos os métodos em um contrato de serviço. Portanto, o WCF também fornece um mecanismo baseado em atributo para permitir que as preferências de fluxo de transação de cada método sejam expressas. Isso é obtido pelo TransactionFlowAttribute que especifica o nível no qual uma operação de serviço aceita um cabeçalho de transação. Você deve marcar seus métodos de contrato de serviço com esse atributo se quiser habilitar o fluxo de transação. Esse atributo usa um dos valores da enumeração TransactionFlowOption, no qual o valor padrão é NotAllowed. Se qualquer valor exceto NotAllowed for especificado, o método será necessário para não ser unidirecional. Um desenvolvedor pode usar esse atributo para especificar requisitos ou restrições de fluxo de transação no nível do método em tempo de design.

Habilitando o fluxo de transação no nível do ponto de extremidade

Além da configuração de fluxo de transação no nível do método que o atributo TransactionFlowAttribute fornece, o WCF fornece uma configuração de todo o ponto de extremidade para o fluxo de transações para permitir que os administradores controlem o fluxo de transação em um nível mais alto.

Isso é obtido pelo TransactionFlowBindingElement, que permite habilitar ou desabilitar o fluxo de transação de entrada nas configurações de associação de um ponto de extremidade, bem como especificar o formato de protocolo de transação desejado para transações de entrada.

Se a associação tiver desabilitado o fluxo de transação, mas uma das operações em um contrato de serviço exigir uma transação de entrada, uma exceção de validação será gerada na inicialização do serviço.

A maioria das associações permanentes que o WCF fornece contêm os atributos transactionFlow e transactionProtocol para permitir que você configure a associação específica para aceitar transações de entrada. Para obter mais informações sobre como configurar os elementos de configuração, consulte <associação>.

Um administrador ou implantador pode usar o fluxo de transação no nível do ponto de extremidade para configurar requisitos ou restrições de fluxo de transação no momento da implantação usando o arquivo de configuração.

Segurança

Para garantir a segurança e a integridade do sistema, você deve proteger as trocas de mensagens ao fluir transações entre aplicativos. Você não deve fluir nem divulgar detalhes da transação para qualquer aplicativo que não tenha o direito de participar da mesma transação.

Ao gerar clientes WCF para serviços Web desconhecidos ou não confiáveis por meio do uso da troca de metadados, as chamadas para operações nesses serviços Web devem suprimir a transação atual, se possível. O exemplo a seguir demonstra como fazer isso.

//client code which has an ambient transaction  
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress))  
{  
    // No transaction will flow to this operation  
    untrustedProxy.Operation1(...);  
    scope.Complete();  
}  
//remainder of client code  

Além disso, os serviços devem ser configurados para aceitar transações de entrada somente de clientes que eles autenticaram e autorizaram. As transações de entrada só devem ser aceitas se forem provenientes de clientes altamente confiáveis.

Instruções de política

O WCF usa instruções de política para controlar o fluxo de transação. As instruções de política podem ser encontradas no documento de política de um serviço, que é gerado pela agregação de contratos, configuração e atributos. O cliente pode obter o documento de política do serviço usando um HTTP GET ou um WS-MetadataExchange solicitação-resposta. Os clientes podem processar o documento da política para determinar quais operações em um contrato de serviço podem dar suporte ou exigir fluxo de transação.

As instruções de política de fluxo de transação afetam o fluxo de transação especificando os cabeçalhos SOAP que um cliente deve enviar a um serviço para representar uma transação. Todos os cabeçalhos de transação devem ser marcados com MustUnderstand igual a true. Qualquer mensagem com um cabeçalho marcado de outra forma é rejeitada com uma falha SOAP.

Somente uma instrução de política relacionada à transação pode estar presente em uma única operação. Documentos de política com mais de uma instrução de transação em uma operação são considerados inválidos e rejeitados pelo WCF. Além disso, apenas um único protocolo de transação pode estar presente dentro de cada tipo de porta. Documentos de política com operações que fazem referência a mais de um protocolo de transação dentro de um único tipo de porta são considerados inválidos e são rejeitados pela Ferramenta de Utilitário de Metadados ServiceModel (Svcutil.exe). Documentos de política com instruções de transação presentes em mensagens de saída ou mensagens de entrada unidirecionais também são considerados inválidos.