Aktivieren des TransaktionsflussesEnabling Transaction Flow

Windows Communication Foundation (WCF) bietet mit sehr flexible Optionen zum Steuern des Transaktionsflusses.Windows Communication Foundation (WCF) provides highly flexible options for controlling transaction flow. Die Transaktionsflusseinstellungen eines Dienstes können durch eine Kombination aus Attributen und Konfigurationen ausgedrückt werden.A service's transaction flow settings can be expressed using a combination of attributes and configuration.

TransaktionsflusseinstellungenTransaction Flow Settings

Transaktionsflusseinstellungen werden als Ergebnis einer Schnittmenge aus den folgenden drei Werten für einen Dienstendpunkt generiert:Transaction flow settings are generated for a service endpoint as a result of the intersection of the following three values:

  • Dem TransactionFlowAttribute-Attribut, das für jede Methode im Dienstvertrag angegeben wird.The TransactionFlowAttribute attribute specified for each method in the service contract.

  • Der TransactionFlow-Bindungseigenschaft in der speziellen Bindung.The TransactionFlow binding property in the specific binding.

  • Der TransactionFlowProtocol-Bindungseigenschaft in der speziellen Bindung.The TransactionFlowProtocol binding property in the specific binding. Mit der TransactionFlowProtocol-Bindungseigenschaft können Sie eines von zwei unterschiedlichen Transaktionsprotokollen für einen Transaktionsfluss auswählen.The TransactionFlowProtocol binding property enables you to choose among two different transaction protocols that you can use to flow a transaction. Diese Protokolle werden jeweils in den folgenden Abschnitten kurz erläutert.The following sections briefly describe each of them.

WS-AtomicTransaction-ProtokollWS-AtomicTransaction Protocol

Das WS-AtomicTransaction-Protokoll (WS-AT) eignet sich für Szenarien, in denen die Interoperabilität mit Protokollstapeln eines Drittanbieters erforderlich ist.The WS-AtomicTransaction (WS-AT) protocol is useful for scenarios when interoperability with third-party protocol stacks is required.

OleTransactions-ProtokollOleTransactions Protocol

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.The OleTransactions protocol is useful for scenarios when interoperability with third-party protocol stacks is not required, and the deployer of a service knows in advance that the WS-AT protocol service is disabled locally or the existing network topology does not favor the usage of WS-AT.

In der folgenden Tabelle werden die unterschiedlichen Transaktionsflüsse aufgeführt, die mit den verschiedenen Kombinationen generiert verwendet werden können.The following table shows the different types of transaction flows that can be generated using these various combinations.

TransactionFlow-TransactionFlow

Bindungbinding
TransactionFlow-BindungseigenschaftTransactionFlow binding property TransactionFlowProtocol-BindungsprotokollTransactionFlowProtocol binding protocol Typ des TransaktionsflussesType of transaction flow
ErforderlichMandatory truetrue WS-ATWS-AT Der Transaktionsfluss muss im interoperablen WS-AT-Format erfolgen.Transaction must be flowed in the interoperable WS-AT format.
ErforderlichMandatory truetrue OleTransactionsOleTransactions Transaktionsfluss muss sich in der WCF-OleTransactions-Format.Transaction must be flowed in the WCF OleTransactions format.
ErforderlichMandatory Falsefalse Nicht zutreffendNot applicable Nicht zutreffend, da es sich um eine ungültige Konfiguration handelt.Not applicable because this is an invalid configuration.
AllowedAllowed truetrue WS-ATWS-AT Der Transaktionsfluss kann im interoperablen WS-AT-Format erfolgen.Transaction may be flowed in the interoperable WS-AT format.
AllowedAllowed truetrue OleTransactionsOleTransactions Die Transaktionsfluss kann in der WCF-OleTransactions-Format.Transaction may be flowed in the WCF OleTransactions format.
AllowedAllowed Falsefalse Beliebiger WertAny value Es erfolgt kein Transaktionsfluss.A transaction is not flowed.
NotAllowedNotAllowed Beliebiger WertAny value Beliebiger WertAny value Es erfolgt kein Transaktionsfluss.A transaction is not flowed.

In der folgenden Tabelle wird das Ergebnis der Nachrichtenverarbeitung zusammengefasst.The following table summarizes the message processing result.

Eingehende NachrichtIncoming message TransactionFlow-EinstellungTransactionFlow setting TransaktionsheaderTransaction header Ergebnis der NachrichtenverarbeitungMessage processing result
Die Transaktion stimmt mit dem erwarteten Protokollformat überein.Transaction matches expected protocol format Allowed oder MandatoryAllowed or Mandatory MustUnderstand ist gleich true.MustUnderstand equals true. ProzessProcess
Die Transaktion stimmt nicht mit dem erwarteten Protokollformat überein.Transaction does not match expected protocol format ErforderlichMandatory MustUnderstand ist gleich false.MustUnderstand equals false. Abgelehnt, da eine Transaktion erforderlich ist.Rejected because a transaction is required
Die Transaktion stimmt nicht mit dem erwarteten Protokollformat überein.Transaction does not match expected protocol format AllowedAllowed MustUnderstand ist gleich false.MustUnderstand equals false. Abgelehnt, da der Header nicht interpretiert werden kann.Rejected because the header is not understood
Transaktion mit einem beliebigen ProtokollformatTransaction using any protocol format NotAllowedNotAllowed MustUnderstand ist gleich false.MustUnderstand equals false. Abgelehnt, da der Header nicht interpretiert werden kann.Rejected because the header is not understood
Keine TransaktionNo transaction ErforderlichMandatory Nicht zutreffendN/A Abgelehnt, da eine Transaktion erforderlich ist.Rejected because a transaction is required
Keine TransaktionNo transaction AllowedAllowed Nicht zutreffendN/A ProzessProcess
Keine TransaktionNo transaction NotAllowedNotAllowed Nicht zutreffendN/A ProzessProcess

Jede Methode eines Vertrags kann zwar verschiedene Transaktionsflussanforderungen aufweisen, die Einstellung des Transaktionsflussprotokolls wird jedoch auf der Bindungsebene festgelegt.While each method on a contract can have different transaction flow requirements, the transaction flow protocol setting is scoped at the level of the binding. 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.This means that all methods that share the same endpoint (and therefore the same binding) also share the same policy allowing or requiring transaction flow, as well as the same transaction protocol if applicable.

Aktivieren des Transaktionsflusses auf der MethodenebeneEnabling Transaction Flow at the Method Level

Transaktionsflussanforderungen sind nicht immer für alle Methoden in einem Dienstvertrag identisch.Transaction flow requirements are not always the same for all methods in a service contract. WCF bietet deshalb auch einen Attributen basierenden Mechanismus bereit, jede Methode Transaktion transaktionsflusseinstellungen ausgedrückt werden können.Therefore, WCF also provides an attribute-based mechanism to allow each method's transaction flow preferences to be expressed. Dazu wird mit TransactionFlowAttribute die Ebene angegeben, auf der ein Dienstvorgang einen Transaktionsheader akzeptiert.This is achieved by the TransactionFlowAttribute that specifies the level in which a service operation accepts a transaction header. Kennzeichnen Sie die Methoden des Dienstvertrags mit diesem Attribut, wenn Sie den Transaktionsfluss aktivieren möchten.You should mark your service contract methods with this attribute if you want to enable transaction flow. Dieses Attribut verwendet einen der Werte der TransactionFlowOption-Enumeration, wobei hier der Standardwert NotAllowed lautet.This attribute takes one of the values of the TransactionFlowOption enumeration, in which the default value is NotAllowed. Wenn ein anderer Wert als NotAllowed angegeben wird, darf die Methode nicht unidirektional sein.If any value except NotAllowed is specified, the method is required to not be one-way. Ein Entwickler kann mit diesem Attribut Transaktionsflussanforderungen auf Methodenebene oder Einschränkungen zur Entwurfszeit angeben.A developer can use this attribute to specify method-level transaction flow requirements or constraints at design time.

Aktivieren des Transaktionsflusses auf der EndpunktebeneEnabling Transaction Flow at the Endpoint Level

Abgesehen von der Methodenebene der TransactionFlowAttribute -Attribut stellt WCF bietet eine Endpunkt-weiten-Einstellung für den Transaktionsfluss um Administratoren ermöglichen, den Transaktionsfluss auf einer höheren Ebene gesteuert.In addition to the method-level transaction flow setting the TransactionFlowAttribute attribute provides, WCF provides an endpoint-wide setting for transaction flow to allow administrators to control transaction flow at a higher level.

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.This is achieved by the TransactionFlowBindingElement, which enables you to enable or disable incoming transaction flow in an endpoint’s binding settings, as well as to specify the desired transaction protocol format for incoming transactions.

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.If the binding has disabled transaction flow, but one of the operations on a service contract requires an incoming transaction, then a validation exception is thrown at service startup.

Die meisten der ständigen Bindungen WCF bietet enthalten die transactionFlow und transactionProtocol Attribute, um die spezielle Bindung für eingehender Transaktionen konfigurieren können.Most of the standing bindings WCF provides contain the transactionFlow and transactionProtocol attributes to enable you to configure the specific binding to accept incoming transactions. Weitere Informationen zum Festlegen von Konfigurationselementen finden Sie unter <Bindung >.For more information about setting the configuration elements, see <binding>.

Ein Administrator oder Bereitsteller kann den Transaktionsfluss auf Endpunktebene verwenden, um mithilfe der Konfigurationsdatei Transaktionsflussanforderungen oder Einschränkungen zur Bereitstellungszeit zu konfigurieren.An administrator or deployer can use endpoint-level transaction flow to configure transaction flow requirements or constraints at deployment time using the configuration file.

SicherheitSecurity

Sichern Sie den Nachrichtenaustausch während des Transaktionsflusses zwischen Anwendungen, um die Sicherheit und Integrität des Systems zu gewährleisten.To ensure system security and integrity, you must secure message exchanges when flowing transactions between applications. Übertragen oder vermitteln Sie keine Transaktionsdetails an Anwendungen, die nicht zur Teilnahme an derselben Transaktion berechtigt sind.You should not flow or disclose transaction details to any application that is not entitled to participate in the same transaction.

Beim Generieren von WCF-Clients für unbekannte oder nicht vertrauenswürdige Webdienste durch die Verwendung von Metadatenaustausch sollten Aufrufe Vorgänge zu diesen Webdiensten möglichst die aktuelle Transaktion unterdrücken.When generating WCF clients to unknown or untrusted Web services through the use of metadata exchange, calls to operations on these Web services should suppress the current transaction if possible. Im folgenden Beispiel wird die dafür erforderliche Vorgehensweise veranschaulicht.The following example demonstrates how to do this.

//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.In addition, services should be configured to accept incoming transactions only from clients that they have authenticated and authorized. Eingehende Transaktionen sollten nur von absolut vertrauenswürdigen Clients angenommen werden.Incoming transactions should only be accepted if they come from highly trusted clients.

RichtlinienassertionenPolicy Assertions

WCF verwendet Richtlinienassertionen, um den Transaktionsfluss zu steuern.WCF uses policy assertions to control transaction flow. Richtlinienassertionen befinden sich im Richtliniendokument eines Dienstes, das durch Aggregation von Verträgen, Konfigurationen und Attributen generiert wird.Policy assertions can be found in a service’s policy document, which is generated by aggregating contracts, configuration, and attributes. Der Client kann das Richtliniendokument des Dienstes mit einem HTTP GET- oder WS-MetadataExchange-Anforderungs-/Anwortvorgang abrufen.The client can obtain the service’s policy document using an HTTP GET or a WS-MetadataExchange request-reply. Anschließend kann der Client das Richtliniendokument verarbeiten und ermitteln, welche Vorgänge zu einem Dienstvertrag einen Transaktionsfluss unterstützen oder erfordern.Clients can then process the policy document to determine which operations on a service contract may support or require transaction flow.

Transaktionsfluss-Richtlinienassertionen beeinflussen den Transaktionsfluss durch Angabe der SOAP-Header, die ein Client an einen Dienst senden muss, um eine Transaktion darzustellen.Transaction flow policy assertions affect transaction flow by specifying the SOAP headers that a client should send to a service to represent a transaction. Alle Transaktionsheader müssen mitMustUnderstand gleich true gekennzeichnet sein.All transaction headers must be marked with MustUnderstand equal to true. Jede Nachricht mit einem anders gekennzeichneten Header wird mit einem SOAP-Fehler abgelehnt.Any message with a header marked otherwise is rejected with a SOAP fault.

Für einen einzelnen Vorgang kann es nur eine transaktionsbezogene Richtlinienassertion geben.Only one transaction-related policy assertion can be present on a single operation. Richtliniendokumente mit mehreren transaktionsassertionen für einen Vorgang sind ungültig und werden vom WCF zurückgewiesen.Policy documents with more than one transaction assertion on an operation are considered invalid and are rejected by WCF. Darüber hinaus kann nur ein einziges Transaktionsprotokoll in den einzelnen Anschlusstypen vorhanden sein.In addition, only a single transaction protocol can be present inside each port type. Richtliniendokumente mit Verweisen auf mehr als ein Transaktionsprotokoll in einer einzelnen Anschlusstypen Vorgänge werden als ungültig betrachtet, und werden vom zurückgewiesen der ServiceModel Metadata Utility Tool (Svcutil.exe).Policy documents with operations referencing more than one transaction protocol inside a single port type are considered invalid, and are rejected by the ServiceModel Metadata Utility Tool (Svcutil.exe). Richtliniendokumente mit Transaktionsassertionen zu Ausgabenachrichten oder unidirektionalen Eingabenachrichten sind ebenfalls ungültig.Policy documents with transaction assertions present on output messages or one-way input messages are also considered invalid.