Partilhar via


Habilitando o fluxo de transações

O Windows Communication Foundation (WCF) fornece opções altamente flexíveis para controlar o fluxo de transações. 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 de 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 da interseção dos três valores a seguir:

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

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

  • A TransactionFlowProtocol propriedade de associação na vinculação específica. A TransactionFlowProtocol propriedade binding 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 um deles.

Protocolo WS-AtomicTransaction

O protocolo WS-AtomicTransaction (WS-AT) é útil para cenários em que a interoperabilidade com pilhas de protocolos 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 de antemão 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ções que podem ser gerados usando essas várias combinações.

TransactionFlow

vinculante
Propriedade de ligação TransactionFlow Protocolo de vinculação TransactionFlowProtocol Tipo de fluxo de transações
Obrigatório verdadeiro WS-AT A transação deve ser executada no formato interoperável WS-AT.
Obrigatório verdadeiro OleTransactions A transação deve ser transmitida no formato de OleTransactions WCF.
Obrigatório falso Não aplicável Não aplicável porque esta é uma configuração inválida.
Permitido verdadeiro WS-AT A transação pode ser fluída no formato WS-AT interoperável.
Permitido verdadeiro OleTransactions A transação pode ser processada no formato WCF OleTransactions.
Permitido falso Qualquer valor Uma transação não foi processada.
Não permitido Qualquer valor Qualquer valor Uma transação não foi processada.

A tabela a seguir resume o resultado do processamento de mensagens.

Mensagem recebida Configuração TransactionFlow Cabeçalho da transação Resultado do processamento de mensagens
A transação corresponde ao formato de protocolo esperado Permitido ou Obrigatório MustUnderstand igual a true. Processo
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 é compreendido
Transação usando qualquer formato de protocolo Não permitido MustUnderstand igual a false. Rejeitado porque o cabeçalho não é compreendido
Sem transação Obrigatório N/A Rejeitado porque uma transação é necessária
Sem transação Permitido N/A Processo
Sem transação Não permitido N/A Processo

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 escopo no nível da vinculação. Isso significa que todos os métodos que compartilham o mesmo ponto de extremidade (e, portanto, a mesma ligaçã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ções no nível do método

Os requisitos de fluxo de transação nem sempre são os mesmos para todos os métodos em um contrato de serviço. Portanto, o WCF também fornece um mecanismo baseado em atributos para permitir que as preferências de fluxo de transação de cada método sejam expressas. Isso é conseguido pelo TransactionFlowAttribute que especifica o nível em que 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ções. Esse atributo usa um dos valores da TransactionFlowOption enumeração, no qual o valor padrão é NotAllowed. Se for especificado qualquer valor, exceto NotAllowed, o método não deve 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ções no nível do ponto de extremidade

Além de a configuração de fluxo de transação ao nível do método que o atributo TransactionFlowAttribute do WCF fornece, também há uma configuração à escala do ponto de extremidade para o fluxo de transações, permitindo aos administradores exercer controle sobre o fluxo de transações a um nível mais elevado.

Isto é conseguido pelo TransactionFlowBindingElement, que lhe permite habilitar ou desabilitar o fluxo de transações de entrada nas configurações de vinculaçã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ções, mas uma das operações em um contrato de serviço exigir uma transação de entrada, uma exceção de validação será lançada na inicialização do serviço.

A maioria das ligações padrão fornecidas pelo WCF contém os transactionFlow e transactionProtocol atributos para permitir que se configure a ligação específica para aceitar transações de entrada. Para obter mais informações sobre como definir os elementos de configuração, consulte <vinculação>.

Um administrador ou implantador pode usar o fluxo de transações 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 integridade do sistema, você deve proteger as trocas de mensagens ao fluir transações entre aplicativos. Você não deve transferir ou divulgar detalhes da transação para qualquer aplicação que não esteja autorizada a 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 autenticados e autorizados. As transações recebidas só devem ser aceitas se vierem de clientes altamente confiáveis.

Afirmações políticas

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

As asserçõ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.

Apenas uma declaração de política relacionada a transações pode estar presente em uma única operação. Documentos de política com mais de uma declaraçã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 rejeitados pela ServiceModel Metadata Utility Tool (Svcutil.exe). Documentos de política com asserções de transação presentes em mensagens de saída ou mensagens de entrada unidirecionais também são considerados inválidos.