Partager via


Activation du flux de transactions

Windows Communication Foundation (WCF) fournit des options hautement flexibles pour contrôler le flux de transactions. Les paramètres de flux de transaction d’un service peuvent être exprimés à l’aide d’une combinaison d’attributs et de configuration.

Paramètres du flux de transactions

Les paramètres de flux de transaction sont générés pour un point de terminaison de service à la suite de l’intersection des trois valeurs suivantes :

  • Attribut TransactionFlowAttribute spécifié pour chaque méthode dans le contrat de service.

  • Propriété de liaison TransactionFlow dans la liaison spécifique.

  • Propriété de liaison TransactionFlowProtocol dans la liaison spécifique. La TransactionFlowProtocol propriété de liaison vous permet de choisir entre deux protocoles de transaction différents que vous pouvez utiliser pour transmettre une transaction. Les sections suivantes décrivent brièvement chacune d’elles.

protocole WS-AtomicTransaction

Le protocole WS-AtomicTransaction (WS-AT) est utile pour les scénarios où l’interopérabilité avec les piles de protocoles tierces est requise.

Protocole OleTransactions

Le protocole OleTransactions est utile pour les scénarios où l’interopérabilité avec les piles de protocoles tierces n’est pas nécessaire, et le déployeur d’un service sait à l’avance que le service de protocole WS-AT est désactivé localement ou que la topologie de réseau existante ne favorise pas l’utilisation de WS-AT.

Le tableau suivant présente les différents types de flux de transactions qui peuvent être générés à l’aide de ces différentes combinaisons.

TransactionFlow

liaison
Propriété de liaison TransactionFlow Protocole de liaison TransactionFlowProtocol Type de flux de transaction
Obligatoire vrai WS-AT La transaction doit être transmise au format WS-AT interopérable.
Obligatoire vrai OleTransactions La transaction doit être transmise au format WCF OleTransactions.
Obligatoire faux Sans objet Non applicable, car il s’agit d’une configuration non valide.
Autorisé vrai WS-AT La transaction peut être transmise au format WS-AT interopérable.
Autorisé vrai OleTransactions La transaction peut être transmise au format WCF OleTransactions.
Autorisé faux Valeur quelconque Une transaction n’est pas transmise.
Non autorisé Valeur quelconque Valeur quelconque Une transaction n’est pas transmise.

Le tableau suivant récapitule le résultat de traitement des messages.

Message entrant Paramètre TransactionFlow En-tête de transaction Résultat du traitement des messages
La transaction correspond au format de protocole attendu Autorisé ou obligatoire MustUnderstand est égal à true. Processus
La transaction ne correspond pas au format de protocole attendu Obligatoire MustUnderstand est égal à false. Rejeté, car une transaction est requise
La transaction ne correspond pas au format de protocole attendu Autorisé MustUnderstand est égal à false. Rejeté, car l’en-tête n’est pas compris
Transaction à l’aide de n’importe quel format de protocole Non autorisé MustUnderstand est égal à false. Rejeté, car l’en-tête n’est pas compris
Aucune transaction Obligatoire N/A Rejeté, car une transaction est requise
Aucune transaction Autorisé N/A Processus
Aucune transaction Non autorisé N/A Processus

Alors que chaque méthode sur un contrat peut avoir des exigences de flux de transaction différentes, le paramètre de protocole de flux de transaction est délimité au niveau de la liaison. Cela signifie que toutes les méthodes qui partagent le même point de terminaison (et par conséquent la même liaison) partagent également la même stratégie autorisant ou nécessitant un flux de transactions, ainsi que le même protocole de transaction le cas échéant.

Activation du flux de transaction au niveau de la méthode

Les exigences de flux de transaction ne sont pas toujours identiques pour toutes les méthodes d’un contrat de service. Par conséquent, WCF fournit également un mécanisme basé sur des attributs pour permettre l’expression des préférences de flux de transaction de chaque méthode. Pour ce faire, le TransactionFlowAttribute spécifie le niveau auquel une opération de service accepte un en-tête de transaction. Vous devez marquer vos méthodes de contrat de service avec cet attribut si vous souhaitez activer le flux de transaction. Cet attribut prend l’une des valeurs de l’énumération TransactionFlowOption , dans laquelle la valeur par défaut est NotAllowed. Si une valeur à l’exception NotAllowed est spécifiée, la méthode est requise pour ne pas être unidirectionnelle. Un développeur peut utiliser cet attribut pour spécifier les exigences ou contraintes de flux de transaction au niveau de la méthode au moment de la conception.

Activation du flux de transactions au niveau du point de terminaison

Outre le paramètre de flux de transaction au niveau de la méthode fourni par l’attribut TransactionFlowAttribute , WCF fournit un paramètre à l’échelle du point de terminaison pour le flux de transactions afin de permettre aux administrateurs de contrôler le flux de transactions à un niveau supérieur.

Cela est obtenu par le TransactionFlowBindingElement, qui vous permet d’activer ou de désactiver le flux de transactions entrantes dans les paramètres de liaison d’un point de terminaison, ainsi que de spécifier le format de protocole de transaction souhaité pour les transactions entrantes.

Si la liaison a désactivé le flux de transaction, mais que l’une des opérations sur un contrat de service nécessite une transaction entrante, une exception de validation est levée au démarrage du service.

La plupart des liaisons persistantes que WCF fournit contiennent les attributs transactionFlow et transactionProtocol pour vous permettre de configurer la liaison spécifique afin d'accepter les transactions entrantes. Pour plus d'informations sur la définition des éléments de configuration, consultez <configuration de liaison>.

Un administrateur ou un déployeur peut utiliser le flux de transaction au niveau du point de terminaison pour configurer les exigences de flux de transaction ou les contraintes au moment du déploiement à l’aide du fichier de configuration.

Sécurité

Pour garantir la sécurité et l’intégrité du système, vous devez sécuriser les échanges de messages lors du flux de transactions entre les applications. Vous ne devez pas transmettre ou divulguer les détails de transaction à une application qui n’a pas le droit de participer à la même transaction.

Lors de la génération de clients WCF vers des services Web inconnus ou non approuvés via l’utilisation d’un échange de métadonnées, les appels aux opérations sur ces services web doivent supprimer la transaction actuelle si possible. L'exemple suivant illustre la procédure à suivre pour réaliser cette opération.

//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  

De plus, les services doivent être configurés pour accepter les transactions entrantes uniquement à partir des clients qu’ils ont authentifiés et autorisés. Les transactions entrantes ne doivent être acceptées que si elles proviennent de clients hautement approuvés.

Assertions de stratégie

WCF utilise des assertions de stratégie pour contrôler le flux de transactions. Les assertions de stratégie se trouvent dans le document de stratégie d’un service, qui est généré par l’agrégation de contrats, de configuration et d’attributs. Le client peut obtenir le document de stratégie du service à l’aide d’une requête-réponse HTTP GET ou d’un WS-MetadataExchange. Les clients peuvent ensuite traiter le document de stratégie pour déterminer quelles opérations sur un contrat de service peuvent prendre en charge ou exiger un flux de transaction.

Les assertions de stratégie de flux de transactions affectent le flux de transactions en spécifiant les en-têtes SOAP qu’un client doit envoyer à un service pour représenter une transaction. Tous les en-têtes de transaction doivent être marqués avec MustUnderstand égal à true. Tout message avec un en-tête marqué autrement est rejeté avec une erreur SOAP.

Une seule assertion de stratégie liée à la transaction peut être présente sur une seule opération. Les documents de stratégie avec plusieurs assertions de transaction sur une opération sont considérés comme non valides et rejetés par WCF. En outre, seul un seul protocole de transaction peut être présent à l’intérieur de chaque type de port. Les documents de stratégie avec opérations référençant plusieurs protocoles de transaction à l’intérieur d’un seul type de port sont considérés comme non valides et sont rejetés par l’outil utilitaire de métadonnées ServiceModel (Svcutil.exe). Les documents de stratégie avec assertions de transaction présents sur les messages de sortie ou les messages d’entrée unidirectionnels sont également considérés comme non valides.