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. MedTransactionFlowProtocol
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 true
med 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.