So arbeiten Sie mit transaktionalen WCF-Diensten

WCF (Windows Communication Foundation) ist eine sichere, zuverlässige und skalierbare Messaging-Plattform für die Entwicklung von Diensten in .Net.

Eine Transaktion ist eine Reihe von Anweisungen, die nach den ACID-Prinzipien ausgeführt werden (ACID steht für atomare, konsistente, isolierte und dauerhafte Operationen). Wenn eine der Operationen im Transaktionsblock fehlschlägt, wird die gesamte Transaktion abgebrochen, dh die gesamte Transaktion schlägt fehl. WCF bietet Unterstützung für verteilte Transaktionsvorgänge. Sie können die im System.Transactions-Namespace vorhandene TransactionScope-Klasse für eine effiziente Transaktionsverwaltung bei der Arbeit in .Net nutzen.

Implementieren von WCF-Transaktionen

In diesem Abschnitt werden wir untersuchen, wie wir transaktionale WCF-Dienste erstellen können. Erstellen Sie zunächst zwei WCF-Dienste. Sie können auch ein anderes Projekt (eine Konsole oder ein Webprojekt) erstellen, um Ihre Dienste zu testen. Nachdem die beiden WCF-Services erstellt wurden, sollten Sie die Betriebsverträge, die Teil der Transaktion sein würden, mit dem TransactionFlow-Attribut dekorieren. Dies ist erforderlich, um die Transaktionsunterstützung zu aktivieren.

Dieses Attribut akzeptiert die TransactionFlowOption-Enumeration als Parameter. Die TransactionFlowOption kann einen der folgenden Werte haben:

  • TransactionFlowOption.Allowed
  • TransactionFlowOption.Mandatory
  • TransactionFlowOption.NotAllowed

Wenn Sie mit WCF arbeiten, müssen Sie zuerst einen Servicevertrag erstellen und dann die darin enthaltenen Servicevorgänge oder Betriebsverträge definieren. Sie haben viele verschiedene Arten von Verträgen in WCF - Serviceverträge, Datenverträge, Fehlerverträge, Nachrichtenverträge und Betriebsverträge. In diesem Beispiel werden Serviceverträge und Betriebsverträge verwendet, da die anderen optional sein können. Ein ServiceContract wird verwendet, um die Vorgänge anzugeben, die dem Service-Client zur Verfügung stehen. In diesem Abschnitt erstellen wir zwei Serviceverträge für die beiden von uns verwendeten WCF-Services.

Das folgende Codeausschnitt zeigt, wie Sie das TransactionFlow-Attribut in Ihrem WCF-Servicevertrag konfigurieren können, um Transaktionsunterstützung bereitzustellen. Beachten Sie, dass Sie dies auch in den anderen Betriebsverträgen (die Teil der Transaktion sind) tun müssen.

[ServiceContract]

public interface IOrderService

{

    [OperationContract]

    [TransactionFlow(TransactionFlowOption.Allowed  )]

    void AddOrder(Order order);

}

Beachten Sie, dass jeder Servicevertrag einen oder mehrere Betriebsverträge enthalten sollte, um die Vorgänge zu definieren, die über das Kabel verfügbar sind. Ein Betriebsvertrag wird verwendet, um die Signatur der Servicemethode sowie den Transaktionsfluss, die Richtung des Servicevorgangs und optional etwaige Fehlerverträge zu definieren.

So würde die IOrderHeaderService-Schnittstelle (Servicevertrag) aussehen.

[ServiceContract]

public interface IOrderHeaderService

{

    [OperationContract]

    [TransactionFlow(TransactionFlowOption.Allowed  )]

    void AddOrderHeader(OrderHeader orderHeader);

}

Als Nächstes sollten Sie sicherstellen, dass Ihre Servicemethode mit TransactionScopeRequired mithilfe des OperationBehavior-Attributs dekoriert ist. Im Wesentlichen sollten Sie die TransactionScopeRequired-Eigenschaft im Betriebsvertrag auf "true" setzen, wie im folgenden Codeausschnitt gezeigt. Die Anweisung TransactionScopeRequired = true wird verwendet, um anzugeben, dass für die Serviceoperation ein Transaktionsbereich ausgeführt werden muss.

[OperationBehavior(TransactionScopeRequired = true)]

public void AddOrder(Order order)

{

   // Write code here to add an order record to the database

}

Die gleiche Änderung gilt auch für den anderen Servicebetrieb.

[OperationBehavior(TransactionScopeRequired = true)]

public void AddOrderHeader(OrderHeader orderHeader)

{

   // Write code here to add an order header record to the database

}

Der nächste Schritt besteht darin, Ihre Dienstkonfigurationsdatei so zu konfigurieren, dass der Transaktionsfluss aktiviert wird. Angenommen, Sie verwenden wsHttpBinding, können Sie Ihren WCF-Dienst wie folgt konfigurieren, um die Unterstützung des Transaktionsflusses bereitzustellen.

Beachten Sie, dass Sie bei der Arbeit mit Transaktions-WCF-Diensten optional zuverlässige Nachrichten angeben können, um die Möglichkeit von abgebrochenen Transaktionen aufgrund von Kommunikationsfehlern zu verringern. Sie sollten auch Ihre WCF-Service-Endpunkte entsprechend konfigurieren, um die soeben definierte Bindung zu nutzen.

                bindingConfiguration="Transactional" contract="Services.IOrderService">

You would now need to take advantage of the TransactionScope class present in the System.Transactions namespace to call your services from within one transaction scope. Typically you can use this class to implement transaction scope for handling interdependent transactions and resolve concurrency conflicts when working with ADO.Net.

try

{

  using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew))

  {

    // Write code here to call the service methods of your services here

    transactionScope.Complete();

  }

}

catch

{

  //Write code here to handle exceptions

}

And that's all you need to do. You can now execute your application and test your transactional services.