Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
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
TransactionFlowi den specifika bindningen.Bindningsegenskapen
TransactionFlowProtocoli den specifika bindningen. MedTransactionFlowProtocolbindningsegenskapen 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.