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 TransactionFlowAttribute atributo especificado para cada método no contrato de serviço.

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

  • A TransactionFlowProtocol propriedade binding 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 protocolos 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 que 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

binding
Propriedade de vinculação TransactionFlow Protocolo de vinculação TransactionFlowProtocol Tipo de fluxo de transações
Obrigatório verdadeiro WS-AT A transação deve ser fluída no formato WS-AT interoperável.
Obrigatório verdadeiro OleTransactions A transação deve ser fluída no formato WCF OleTransactions.
Obrigatório false 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 fluída no formato WCF OleTransactions.
Permitido false Qualquer valor Uma transação não é fluída.
Não permitido Qualquer valor Qualquer valor Uma transação não é fluída.

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 qualquer valor for NotAllowed especificado, o método deve 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ções 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 fornece, o TransactionFlowAttribute WCF fornece uma configuração de ponto de extremidade para o fluxo de transações para permitir que os administradores controlem o fluxo de transações em um nível mais alto.

Isso é conseguido pelo , que permite habilitar ou desabilitar o TransactionFlowBindingElementfluxo 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 permanentes fornecidas pelo WCF contém os transactionFlow atributos 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 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 fluir ou 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 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.