Aktivieren des Transaktionsflusses
Windows Communication Foundation (WCF) bietet hochflexible Optionen zum Steuern des Transaktionsflusses. Die Transaktionsflusseinstellungen eines Dienstes können durch eine Kombination aus Attributen und Konfigurationen ausgedrückt werden.
Transaktionsflusseinstellungen
Transaktionsflusseinstellungen werden als Ergebnis einer Schnittmenge aus den folgenden drei Werten für einen Dienstendpunkt generiert:
Dem TransactionFlowAttribute-Attribut, das für jede Methode im Dienstvertrag angegeben wird.
Der
TransactionFlow
-Bindungseigenschaft in der speziellen Bindung.Der
TransactionFlowProtocol
-Bindungseigenschaft in der speziellen Bindung. Mit derTransactionFlowProtocol
-Bindungseigenschaft können Sie eines von zwei unterschiedlichen Transaktionsprotokollen für einen Transaktionsfluss auswählen. Diese Protokolle werden jeweils in den folgenden Abschnitten kurz erläutert.
WS-AtomicTransaction-Protokoll
Das WS-AtomicTransaction-Protokoll (WS-AT) eignet sich für Szenarien, in denen die Interoperabilität mit Protokollstapeln eines Drittanbieters erforderlich ist.
OleTransactions-Protokoll
Das OleTransactions-Protokoll eignet sich für Szenarien, in denen die Interoperabilität mit Protokollstapeln eines Drittanbieters nicht erforderlich ist und der Bereitsteller des Dienstes im Voraus weiß, dass der WS-AT-Protokolldienst lokal deaktiviert ist oder die vorhandene Netzwerktopologie die Verwendung von WS-AT nicht unterstützt.
In der folgenden Tabelle werden die unterschiedlichen Transaktionsflüsse aufgeführt, die mit den verschiedenen Kombinationen generiert verwendet werden können.
TransactionFlow bindung |
TransactionFlow-Bindungseigenschaft | TransactionFlowProtocol-Bindungsprotokoll | Typ des Transaktionsflusses |
---|---|---|---|
Obligatorisch. | true | WS-AT | Der Transaktionsfluss muss im interoperablen WS-AT-Format erfolgen. |
Obligatorisch. | true | OleTransactions | Der Transaktionsfluss muss im OleTransactions-Format von WCF erfolgen. |
Obligatorisch. | false | Nicht zutreffend | Nicht zutreffend, da es sich um eine ungültige Konfiguration handelt. |
Zulässig | true | WS-AT | Der Transaktionsfluss kann im interoperablen WS-AT-Format erfolgen. |
Zulässig | true | OleTransactions | Der Transaktionsfluss kann im OleTransactions-Format von WCF erfolgen. |
Zulässig | False | Beliebiger Wert | Es erfolgt kein Transaktionsfluss. |
Nicht zulässig | Beliebiger Wert | Beliebiger Wert | Es erfolgt kein Transaktionsfluss. |
In der folgenden Tabelle wird das Ergebnis der Nachrichtenverarbeitung zusammengefasst.
Eingehende Nachricht | TransactionFlow-Einstellung | Transaktionsheader | Ergebnis der Nachrichtenverarbeitung |
---|---|---|---|
Die Transaktion stimmt mit dem erwarteten Protokollformat überein. | Allowed oder Mandatory | MustUnderstand ist gleich true . |
Prozess |
Die Transaktion stimmt nicht mit dem erwarteten Protokollformat überein. | Obligatorisch. | MustUnderstand ist gleich false . |
Abgelehnt, da eine Transaktion erforderlich ist. |
Die Transaktion stimmt nicht mit dem erwarteten Protokollformat überein. | Zulässig | MustUnderstand ist gleich false . |
Abgelehnt, da der Header nicht interpretiert werden kann. |
Transaktion mit einem beliebigen Protokollformat | Nicht zulässig | MustUnderstand ist gleich false . |
Abgelehnt, da der Header nicht interpretiert werden kann. |
Keine Transaktion | Obligatorisch. | – | Abgelehnt, da eine Transaktion erforderlich ist. |
Keine Transaktion | Zulässig | – | Prozess |
Keine Transaktion | Nicht zulässig | – | Prozess |
Jede Methode eines Vertrags kann zwar verschiedene Transaktionsflussanforderungen aufweisen, die Einstellung des Transaktionsflussprotokolls wird jedoch auf der Bindungsebene festgelegt. Das bedeutet, dass alle Methoden, die denselben Endpunkt gemeinsam nutzen (und somit dieselbe Bindung), auch dieselbe Richtlinie verwenden, die einen Transaktionsfluss zulässt oder verlangt, sowie gegebenenfalls dasselbe Transaktionsprotokoll.
Aktivieren des Transaktionsflusses auf der Methodenebene
Transaktionsflussanforderungen sind nicht immer für alle Methoden in einem Dienstvertrag identisch. Deshalb stellt WCF auch einen auf Attributen basierenden Mechanismus bereit, mit dem die Transaktionsflusseinstellungen für jede Methode ausgedrückt werden können. Dazu wird mit TransactionFlowAttribute die Ebene angegeben, auf der ein Dienstvorgang einen Transaktionsheader akzeptiert. Kennzeichnen Sie die Methoden des Dienstvertrags mit diesem Attribut, wenn Sie den Transaktionsfluss aktivieren möchten. Dieses Attribut verwendet einen der Werte der TransactionFlowOption-Enumeration, wobei hier der Standardwert NotAllowed lautet. Wenn ein anderer Wert als NotAllowed angegeben wird, darf die Methode nicht unidirektional sein. Ein Entwickler kann mit diesem Attribut Transaktionsflussanforderungen auf Methodenebene oder Einschränkungen zur Entwurfszeit angeben.
Aktivieren des Transaktionsflusses auf der Endpunktebene
Abgesehen von der Transaktionsflusseinstellung auf Methodenebene, die das TransactionFlowAttribute-Attribute ermöglicht, stellt eine Einstellung für den gesamten Endpunkt bereit, mit der Transaktionsfluss auf einer höheren Ebene gesteuert werden kann.
Sie verwenden dazu TransactionFlowBindingElement. Damit können Sie den eingehenden Transaktionsfluss in der Bindungseinstellung eines Endpunkts aktivieren oder deaktivieren und das gewünschte Transaktionsprotokollformat für eingehende Transaktionen angeben.
Wenn der Transaktionsfluss der Bindung deaktiviert ist, jedoch einer der Vorgänge eines Dienstvertrags eine eingehende Transaktion erfordert, wird beim Starten des Dienstes eine Validierungsausnahme ausgelöst.
Die meisten der von WCF bereitgestellten Bindungen enthalten die Attribute transactionFlow
und transactionProtocol
, sodass Sie die spezielle Bindung für die Annahme eingehender Transaktionen konfigurieren können. Weitere Informationen zum Festlegen der Konfigurationselemente finden Sie unter <Bindung>.
Ein Administrator oder Bereitsteller kann den Transaktionsfluss auf Endpunktebene verwenden, um mithilfe der Konfigurationsdatei Transaktionsflussanforderungen oder Einschränkungen zur Bereitstellungszeit zu konfigurieren.
Sicherheit
Sichern Sie den Nachrichtenaustausch während des Transaktionsflusses zwischen Anwendungen, um die Sicherheit und Integrität des Systems zu gewährleisten. Übertragen oder vermitteln Sie keine Transaktionsdetails an Anwendungen, die nicht zur Teilnahme an derselben Transaktion berechtigt sind.
Wenn Sie unter Verwendung eines Metadatenaustausches WCF-Clients für unbekannte oder nicht vertrauenswürdige Webdienste generieren, sollten Vorgänge zu diesen Webdiensten möglichst die aktuelle Transaktion unterdrücken. Im folgenden Beispiel wird die dafür erforderliche Vorgehensweise veranschaulicht.
//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
Konfigurieren Sie Dienste außerdem so, dass sie eingehende Transaktionen nur von authentifizierten und autorisierten Clients akzeptieren. Eingehende Transaktionen sollten nur von absolut vertrauenswürdigen Clients angenommen werden.
Richtlinienassertionen
WCF verwendet Richtlinienassertionen, um den Transaktionsfluss zu steuern. Richtlinienassertionen befinden sich im Richtliniendokument eines Dienstes, das durch Aggregation von Verträgen, Konfigurationen und Attributen generiert wird. Der Client kann das Richtliniendokument des Dienstes mit einem HTTP GET- oder WS-MetadataExchange-Anforderungs-/Anwortvorgang abrufen. Anschließend kann der Client das Richtliniendokument verarbeiten und ermitteln, welche Vorgänge zu einem Dienstvertrag einen Transaktionsfluss unterstützen oder erfordern.
Transaktionsfluss-Richtlinienassertionen beeinflussen den Transaktionsfluss durch Angabe der SOAP-Header, die ein Client an einen Dienst senden muss, um eine Transaktion darzustellen. Alle Transaktionsheader müssen mitMustUnderstand
gleich true
gekennzeichnet sein. Jede Nachricht mit einem anders gekennzeichneten Header wird mit einem SOAP-Fehler abgelehnt.
Für einen einzelnen Vorgang kann es nur eine transaktionsbezogene Richtlinienassertion geben. Richtliniendokumente mit mehreren Transaktionsassertionen für einen Vorgang sind ungültig und werden von WCF abgelehnt. Darüber hinaus kann nur ein einziges Transaktionsprotokoll in den einzelnen Anschlusstypen vorhanden sein. Richtliniendokumente mit Vorgängen, die auf mehrere Transaktionsprotokolle innerhalb eines einzelnen Porttyps verweisen, werden als ungültig angesehen und vom ServiceModel Metadata Utility Tool (Svcutil.exe) abgelehnt. Richtliniendokumente mit Transaktionsassertionen zu Ausgabenachrichten oder unidirektionalen Eingabenachrichten sind ebenfalls ungültig.