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.

Transaktionsflöde Inställningar

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 Protocol

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

OleTransactions Protocol

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

bindning
Bindningsegenskap för TransactionFlow TransactionFlowProtocol-bindningsprotokoll Typ av transaktionsflöde
Obligatorisk true WS-AT Transaktionen måste flöda i det driftskompatibla WS-AT-formatet.
Obligatorisk true OleTransactions Transaktionen måste flöda i formatet WCF OleTransactions.
Obligatorisk falskt Inte tillämpligt Inte tillämpligt eftersom det här är en ogiltig konfiguration.
Tillåtet true WS-AT Transaktionen kan flöda i det driftskompatibla WS-AT-formatet.
Tillåtet true OleTransactions Transaktionen kan flöda i formatet WCF OleTransactions.
Tillåtet falskt Valfritt värde En transaktion flödas inte.
NotAllowed Valfritt värde Valfritt värde En transaktion flödas 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. Process
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 NotAllowed MustUnderstand är lika med false. Avvisades eftersom rubriken inte är förstådd
Ingen transaktion Obligatorisk Ej tillämpligt Avvisades eftersom en transaktion krävs
Ingen transaktion Tillåtet Ej tillämpligt Process
Ingen transaktion NotAllowed Ej tillämpligt Process

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änståtgärd accepterar ett transaktionshuvud. 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.

Principkontroller

WCF använder principkontroller för att kontrollera transaktionsflödet. Principkontroller finns i en tjänsts principdokument, 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 request-reply. 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 lika truemed MustUnderstand . Alla meddelanden med en rubrik markerad på annat sätt avvisas med ett SOAP-fel.

Endast en transaktionsrelaterad principkontroll kan finnas på en enda åtgärd. Principdokument med mer än en transaktionskontroll 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 fler än ett transaktionsprotokoll i en enda porttyp anses vara ogiltiga och avvisas av Verktyget för ServiceModel-metadata (Svcutil.exe). Principdokument med transaktionskontroller som finns på utdatameddelanden eller enkelriktade indatameddelanden anses också vara ogiltiga.