Dela via


Aktivera transaktionsflöde

Windows Communication Foundation (WCF) ger mycket flexibla alternativ för att kontrollera transaktionsflödet. En tjänsts inställningar för transaktionsflöde kan uttryckas med hjälp av en kombination av attribut och konfiguration.

Inställningar för transaktionsflöde

Inställningar för transaktionsflöde genereras för en tjänstslutpunkt som ett resultat av skärningspunkten mellan följande tre värden:

  • Attributet TransactionFlowAttribute som anges för varje metod i tjänstkontraktet.

  • Bindningsegenskapen TransactionFlow i den specifika bindningen.

  • Bindningsegenskapen TransactionFlowProtocol i den specifika bindningen. Med TransactionFlowProtocol bindningsegenskapen kan du välja mellan två olika transaktionsprotokoll som du kan använda för att flöda en transaktion. Följande avsnitt beskriver kort var och en av dem.

WS-AtomicTransaction-Protokoll

Protokollet WS-AtomicTransaction (WS-AT) är användbart för scenarier när samverkan med protokollstackar från tredje part krävs.

OleTransactions-protokoll

OleTransactions-protokollet är användbart för scenarier när samverkan med protokollstackar från tredje part inte krävs, och distribueraren av en tjänst vet i förväg att den WS-AT protokolltjänsten är inaktiverad lokalt eller om den befintliga nätverkstopologin inte gynnar användningen av WS-AT.

I följande tabell visas de olika typerna av transaktionsflöden som kan genereras med hjälp av dessa olika kombinationer.

TransactionFlow

bindande
Bindningsegenskap för TransactionFlow TransactionFlowProtocol-bindningsprotokoll Typ av transaktionsflöde
Obligatorisk sann WS-AT Transaktionen måste flöda i det driftskompatibla WS-AT formatet.
Obligatorisk sann OleTransactions Transaktionen måste flöda i formatet WCF OleTransactions.
Obligatorisk falskt Ej tillämpligt Inte tillämpligt eftersom det här är en ogiltig konfiguration.
Tillåtet sann WS-AT Transaktionen kan flöda i interoperabelt WS-AT format.
Tillåtet sann OleTransactions Transaktionen kan flöda i formatet WCF OleTransactions.
Tillåtet falskt Valfritt värde En transaktion genomförs inte.
Ej Tillåtet Valfritt värde Valfritt värde En transaktion genomförs inte.

I följande tabell sammanfattas resultatet av meddelandebearbetningen.

Inkommande meddelande TransactionFlow-inställning Transaktionshuvud Resultat av meddelandebearbetning
Transaktionen matchar förväntat protokollformat Tillåtet eller obligatoriskt MustUnderstand är lika med true. Processen
Transaktionen matchar inte förväntat protokollformat Obligatorisk MustUnderstand är lika med false. Avvisades eftersom en transaktion krävs
Transaktionen matchar inte förväntat protokollformat Tillåtet MustUnderstand är lika med false. Avvisades eftersom rubriken inte är förstådd
Transaktion med valfritt protokollformat Ej Tillåtet MustUnderstand är lika med false. Avvisades eftersom rubriken inte är förstådd
Ingen transaktion Obligatorisk Inte tillgänglig Avvisades eftersom en transaktion krävs
Ingen transaktion Tillåtet Inte tillgänglig Processen
Ingen transaktion Ej Tillåtet Inte tillgänglig Processen

Varje metod i ett kontrakt kan ha olika krav för transaktionsflöde, men inställningen för transaktionsflödesprotokollet är begränsad till bindningens nivå. Det innebär att alla metoder som delar samma slutpunkt (och därmed samma bindning) också delar samma princip som tillåter eller kräver transaktionsflöde, samt samma transaktionsprotokoll om tillämpligt.

Aktivera transaktionsflöde på metodnivå

Transaktionsflödeskrav är inte alltid desamma för alla metoder i ett tjänstkontrakt. Därför tillhandahåller WCF också en attributbaserad mekanism som gör att varje metods transaktionsflödesinställningar kan uttryckas. Detta uppnås med det TransactionFlowAttribute som anger den nivå där en tjänstoperation accepterar en transaktionsheader. Du bör markera dina tjänstkontraktsmetoder med det här attributet om du vill aktivera transaktionsflödet. Det här attributet tar ett av värdena för TransactionFlowOption uppräkningen, där standardvärdet är NotAllowed. Om något annat värde än NotAllowed har angetts måste metoden inte vara enkelriktad. En utvecklare kan använda det här attributet för att ange transaktionsflödeskrav på metodnivå eller begränsningar vid designtillfället.

Aktivera transaktionsflöde på slutpunktsnivå

Förutom inställningen för transaktionsflöde TransactionFlowAttribute på metodnivå som attributet tillhandahåller tillhandahåller WCF en slutpunktsomfattande inställning för transaktionsflödet så att administratörer kan kontrollera transaktionsflödet på en högre nivå.

Detta uppnås med TransactionFlowBindingElement, som gör att du kan aktivera eller inaktivera inkommande transaktionsflöde i en slutpunkts bindningsinställningar, samt ange önskat transaktionsprotokollformat för inkommande transaktioner.

Om bindningen har inaktiverat transaktionsflödet, men en av åtgärderna i ett tjänstkontrakt kräver en inkommande transaktion, genereras ett verifieringsfel vid tjänststart.

De flesta stående bindningar som WCF tillhandahåller innehåller attributen transactionFlow och transactionProtocol så att du kan konfigurera den specifika bindningen så att den accepterar inkommande transaktioner. Mer information om hur du ställer in konfigurationselementen finns i <bindning>.

En administratör eller distribuerare kan använda transaktionsflödet på slutpunktsnivå för att konfigurera krav eller begränsningar för transaktionsflödet vid distributionstillfället med hjälp av konfigurationsfilen.

Säkerhet

För att säkerställa systemsäkerhet och integritet måste du skydda meddelandeutbyten när du flödar transaktioner mellan program. Du bör inte flöda eller lämna ut transaktionsinformation till något program som inte har rätt att delta i samma transaktion.

När du genererar WCF-klienter till okända eller ej betrodda webbtjänster med hjälp av metadatautbyte, bör anrop till åtgärder på dessa webbtjänster utelämna den aktuella transaktionen om möjligt. I följande exempel visas hur du gör detta.

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

Dessutom bör tjänster konfigureras för att endast acceptera inkommande transaktioner från klienter som de har autentiserat och auktoriserat. Inkommande transaktioner bör endast accepteras om de kommer från mycket betrodda klienter.

Policyförklaringar

WCF använder principkontroller för att kontrollera transaktionsflödet. Policydeklarationer finns i en tjänsts policy-dokument, som genereras genom aggregering av kontrakt, konfiguration och attribut. Klienten kan hämta tjänstens principdokument med hjälp av en HTTP GET eller ett WS-MetadataExchange begärandesvar. Klienter kan sedan bearbeta principdokumentet för att avgöra vilka åtgärder i ett tjänstkontrakt som kan stödja eller kräva transaktionsflöde.

Försäkran om transaktionsflödesprinciper påverkar transaktionsflödet genom att ange de SOAP-huvuden som en klient ska skicka till en tjänst för att representera en transaktion. Alla transaktionshuvuden måste vara markerade med MustUnderstand lika med true. Alla meddelanden med en rubrik markerad på annat sätt avvisas med ett SOAP-fel.

Endast ett transaktionsrelaterat policyuttalande kan finnas på en enda operation. Principdokument med mer än en transaktionspåstående för en åtgärd anses vara ogiltiga och avvisas av WCF. Dessutom kan endast ett enda transaktionsprotokoll finnas i varje porttyp. Principdokument med åtgärder som refererar till mer än ett transaktionsprotokoll i en enda porttyp anses vara ogiltiga och avvisas av ServiceModel Metadata Utility Tool (Svcutil.exe). Principdokument med transaktionskontroller som finns på utdatameddelanden eller enkelriktade indatameddelanden anses också vara ogiltiga.