Transactiestroom inschakelen
Windows Communication Foundation (WCF) biedt zeer flexibele opties voor het beheren van de transactiestroom. De transactiestroominstellingen van een service kunnen worden uitgedrukt met behulp van een combinatie van kenmerken en configuratie.
Transactiestroom Instellingen
Instellingen voor transactiestromen worden gegenereerd voor een service-eindpunt als gevolg van het snijpunt van de volgende drie waarden:
Het TransactionFlowAttribute kenmerk dat is opgegeven voor elke methode in het servicecontract.
De
TransactionFlow
bindingseigenschap in de specifieke binding.De
TransactionFlowProtocol
bindingseigenschap in de specifieke binding. Met deTransactionFlowProtocol
bindingseigenschap kunt u kiezen uit twee verschillende transactieprotocollen die u kunt gebruiken om een transactie te stromen. In de volgende secties wordt elk van deze secties kort beschreven.
WS-AtomicTransaction Protocol
Het WS-AtomicTransaction-protocol (WS-AT) is handig voor scenario's waarin interoperabiliteit met protocolstacks van derden vereist is.
OleTransactions-protocol
Het OleTransactions-protocol is handig voor scenario's waarbij interoperabiliteit met protocolstacks van derden niet vereist is en de implementatie van een service weet van tevoren dat de WS-AT-protocolservice lokaal is uitgeschakeld of de bestaande netwerktopologie geen voorkeur geeft aan het gebruik van WS-AT.
In de volgende tabel ziet u de verschillende typen transactiestromen die kunnen worden gegenereerd met behulp van deze verschillende combinaties.
TransactionFlow binding |
Bindingseigenschap TransactionFlow | TransactionFlowProtocol-bindingsprotocol | Type transactiestroom |
---|---|---|---|
Verplicht | true | WS-AT | Transactie moet worden gestroomd in de interoperabele WS-AT-indeling. |
Verplicht | true | OleTransactions | Transactie moet worden gestroomd in de WCF OleTransactions-indeling. |
Verplicht | false | Niet van toepassing | Niet van toepassing omdat dit een ongeldige configuratie is. |
Toegestaan | true | WS-AT | Transactie kan worden gestroomd in de interoperabele WS-AT-indeling. |
Toegestaan | true | OleTransactions | Transactie kan worden gestroomd in de WCF OleTransactions-indeling. |
Toegestaan | false | Alle waarden | Er wordt geen transactie gestroomd. |
Niet toegestaan | Alle waarden | Alle waarden | Er wordt geen transactie gestroomd. |
De volgende tabel bevat een overzicht van het resultaat van de berichtverwerking.
Binnenkomend bericht | TransactionFlow-instelling | Transactieheader | Resultaat berichtverwerking |
---|---|---|---|
Transactie komt overeen met de verwachte protocolindeling | Toegestaan of verplicht | MustUnderstand is true gelijk aan . |
Proces |
Transactie komt niet overeen met de verwachte protocolindeling | Verplicht | MustUnderstand is false gelijk aan . |
Geweigerd omdat een transactie is vereist |
Transactie komt niet overeen met de verwachte protocolindeling | Toegestaan | MustUnderstand is false gelijk aan . |
Geweigerd omdat de koptekst niet wordt begrepen |
Transactie met behulp van een protocolindeling | Niet toegestaan | MustUnderstand is false gelijk aan . |
Geweigerd omdat de koptekst niet wordt begrepen |
Geen transactie | Verplicht | N.v.t. | Geweigerd omdat een transactie is vereist |
Geen transactie | Toegestaan | N.v.t. | Proces |
Geen transactie | Niet toegestaan | N.v.t. | Proces |
Hoewel elke methode voor een contract verschillende vereisten voor de transactiestroom kan hebben, wordt de instelling van het transactiestroomprotocol bepaald op het niveau van de binding. Dit betekent dat alle methoden die hetzelfde eindpunt delen (en daarom dezelfde binding) ook hetzelfde beleid delen dat transactiestroom toestaat of vereist, evenals hetzelfde transactieprotocol, indien van toepassing.
Transactiestroom inschakelen op methodeniveau
Vereisten voor transactiestromen zijn niet altijd hetzelfde voor alle methoden in een servicecontract. WCF biedt daarom ook een mechanisme op basis van kenmerken waarmee de voorkeuren voor de transactiestroom van elke methode kunnen worden uitgedrukt. Dit wordt bereikt door het TransactionFlowAttribute niveau op te geven waarin een servicebewerking een transactieheader accepteert. U moet uw servicecontractmethoden markeren met dit kenmerk als u de transactiestroom wilt inschakelen. Dit kenmerk gebruikt een van de waarden van de TransactionFlowOption opsomming, waarin de standaardwaarde is NotAllowed. Als een waarde behalve NotAllowed is opgegeven, moet de methode niet in één richting zijn. Een ontwikkelaar kan dit kenmerk gebruiken om vereisten of beperkingen voor transactiestromen op methodeniveau op te geven tijdens het ontwerp.
Transactiestroom inschakelen op eindpuntniveau
Naast de instelling van de transactiestroom op methodeniveau die het TransactionFlowAttribute kenmerk biedt, biedt WCF een instelling voor de gehele eindpunten voor de transactiestroom, zodat beheerders de transactiestroom op een hoger niveau kunnen beheren.
Dit wordt bereikt door de TransactionFlowBindingElement, waarmee u de binnenkomende transactiestroom kunt in- of uitschakelen in de bindingsinstellingen van een eindpunt en de gewenste indeling van het transactieprotocol voor binnenkomende transacties kunt opgeven.
Als de binding de transactiestroom heeft uitgeschakeld, maar een van de bewerkingen in een servicecontract een binnenkomende transactie vereist, wordt er een validatie-uitzondering gegenereerd bij het opstarten van de service.
De meeste vaste bindingen die WCF biedt, bevatten de transactionFlow
en transactionProtocol
kenmerken waarmee u de specifieke binding kunt configureren om binnenkomende transacties te accepteren. Zie binding> voor meer informatie over het instellen van de configuratie-elementen<.
Een beheerder of implementeerfunctie kan transactiestroom op eindpuntniveau gebruiken om vereisten voor transactiestromen of beperkingen tijdens de implementatie te configureren met behulp van het configuratiebestand.
Beveiliging
Om de systeembeveiliging en -integriteit te waarborgen, moet u berichtenuitwisselingen beveiligen wanneer transacties tussen toepassingen worden verzonden. U mag geen transactiegegevens doorstromen of vrijgeven aan een toepassing die niet gerechtigd is deel te nemen aan dezelfde transactie.
Bij het genereren van WCF-clients naar onbekende of niet-vertrouwde webservices via het gebruik van metagegevensuitwisseling, moeten aanroepen naar bewerkingen op deze webservices de huidige transactie onderdrukken, indien mogelijk. In het volgende voorbeeld ziet u hoe u dit doet.
//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
Bovendien moeten services worden geconfigureerd om alleen binnenkomende transacties te accepteren van clients die ze hebben geverifieerd en geautoriseerd. Binnenkomende transacties mogen alleen worden geaccepteerd als ze afkomstig zijn van zeer vertrouwde clients.
Beleidsverklaringen
WCF gebruikt beleidsverklaringen om de transactiestroom te beheren. Beleidsverklaringen vindt u in het beleidsdocument van een service, dat wordt gegenereerd door het samenvoegen van contracten, configuratie en kenmerken. De client kan het beleidsdocument van de service verkrijgen met behulp van een HTTP GET of een WS-MetadataExchange request-reply. Clients kunnen vervolgens het beleidsdocument verwerken om te bepalen welke bewerkingen in een servicecontract de transactiestroom kunnen ondersteunen of vereisen.
Asserties van transactiestroombeleid zijn van invloed op de transactiestroom door de SOAP-headers op te geven die een client naar een service moet verzenden om een transactie weer te geven. Alle transactieheaders moeten worden gemarkeerd met MustUnderstand
gelijk aan true
. Elk bericht met een koptekst die anders is gemarkeerd, wordt geweigerd met een SOAP-fout.
Er kan slechts één transactiegerelateerde beleidsverklaring aanwezig zijn voor één bewerking. Beleidsdocumenten met meer dan één transactieverklaring voor een bewerking worden als ongeldig beschouwd en worden geweigerd door WCF. Daarnaast kan slechts één transactieprotocol aanwezig zijn binnen elk poorttype. Beleidsdocumenten met bewerkingen die verwijzen naar meer dan één transactieprotocol binnen één poorttype, worden als ongeldig beschouwd en worden geweigerd door het hulpprogramma voor metagegevens van ServiceModel (Svcutil.exe). Beleidsdocumenten met transactieverklaringen die aanwezig zijn in uitvoerberichten of invoerberichten in één richting, worden ook als ongeldig beschouwd.