Programování

Jak pracovat s transakčními službami WCF

WCF (Windows Communication Foundation) je bezpečná, spolehlivá a škálovatelná platforma pro zasílání zpráv pro vývoj služeb v .Net.

Transakce je sada příkazů, které se provádějí podle zásad ACID (ACID znamená Atomic, Consistent, Isolated a Durable operations). Když jedna z operací v transakčním bloku selže, celá transakce se přeruší, tj. Celá transakce selže. WCF poskytuje podporu pro distribuované transakční operace. Třídu TransactionScope přítomnou v oboru názvů System.Transaction můžete využít pro efektivní správu transakcí při práci v .Net.

Implementace transakcí WCF

V této části prozkoumáme, jak můžeme vytvořit transakční služby WCF. Chcete-li začít, vytvořte dvě služby WCF. Můžete také vytvořit jiný projekt (konzolu nebo webový projekt) a otestovat své služby. Jakmile byly vytvořeny dvě služby WCF, měli byste zdobit provozní smlouvy, které by byly součástí transakce, s atributem TransactionFlow. To je nutné k povolení podpory transakcí.

Tento atribut přijímá výčet TransactionFlowOption jako parametr. TransactionFlowOption může mít jednu z následujících hodnot:

  • TransactionFlowOption.Allowed
  • TransactionFlowOption. Povinné
  • TransactionFlowOption.NotAllowed

Při práci s WCF musíte nejprve vytvořit servisní smlouvu a poté v ní definovat provozní operace nebo provozní smlouvy. Ve službě WCF máte mnoho různých typů kontraktů - smlouvy o službách, smlouvy o datech, smlouvy o chybách, smlouvy o zprávách a smlouvy o provozu. V tomto příkladu použijeme servisní smlouvy a provozní smlouvy, protože ostatní mohou být volitelné. ServiceContract se používá k určení operací, které jsou klientovi služby k dispozici ke konzumaci. V této části vytvoříme dvě servisní smlouvy pro dvě služby WCF, které používáme.

Následující fragment kódu ukazuje, jak můžete nakonfigurovat atribut TransactionFlow ve vaší smlouvě o službě WCF, aby poskytoval transakční podporu. Všimněte si, že musíte udělat totéž i v ostatních provozních kontraktech (které jsou součástí transakce).

[ServiceContract]

veřejné rozhraní IOrderService

{

[OperationContract]

[TransactionFlow (TransactionFlowOption.Allowed)]

void AddOrder (objednávka objednávky);

}

Všimněte si, že každá servisní smlouva by měla mít jednu nebo více provozních smluv k definování operací, které jsou vystaveny přes drát. Smlouva o operaci se používá k definování podpisu metody služby a také toku transakcí, směru operace služby a volitelně jakékoli smlouvy o poruše, která může být přidružena.

Takto by vypadalo rozhraní (servisní smlouva) IOrderHeaderService.

[ServiceContract]

veřejné rozhraní IOrderHeaderService

{

[OperationContract]

[TransactionFlow (TransactionFlowOption.Allowed)]

void AddOrderHeader (OrderHeader orderHeader);

}

Dále byste měli zajistit, aby vaše metoda služby byla zdobena TransactionScopeRequired pomocí OperationBehavior atributu. V podstatě byste měli ve smlouvě o operaci nastavit vlastnost TransactionScopeRequired na „true“, jak je ukázáno v úryvku kódu níže. Příkaz TransactionScopeRequired = true se používá k určení, že operace služby vyžaduje provedení transakčního rozsahu.

[OperationBehavior (TransactionScopeRequired = true)]

public void AddOrder (objednávka objednávky)

{

// Sem napište kód pro přidání záznamu objednávky do databáze

}

Stejná změna platí i pro další provoz služby.

[OperationBehavior (TransactionScopeRequired = true)]

public void AddOrderHeader (OrderHeader orderHeader)

{

// Sem napište kód pro přidání záznamu záhlaví objednávky do databáze

}

Dalším krokem je konfigurace konfiguračního souboru služby tak, aby umožňoval tok transakcí. Za předpokladu, že používáte wsHttpBinding, můžete nakonfigurovat službu WCF tak, aby poskytovala podporu toku transakcí, zde.

Všimněte si, že při práci s transakčními službami WCF můžete volitelně zadat spolehlivé zasílání zpráv, abyste zředili možnost přerušených transakcí z důvodu selhání komunikace. Měli byste také odpovídajícím způsobem nakonfigurovat své koncové body služby WCF, abyste využili vazbu, kterou jsme právě definovali.

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

Nyní byste museli využít výhodu třídy TransactionScope přítomné v oboru názvů System.Transaction, abyste mohli volat své služby z jednoho oboru transakcí. Tuto třídu můžete obvykle použít k implementaci oboru transakcí pro zpracování vzájemně závislých transakcí a řešení konfliktů souběžnosti při práci s ADO.Net.

Snaž se

{

pomocí (TransactionScope transactionScope = nový TransactionScope (TransactionScopeOption.RequiresNew))

  {

// Sem napište kód pro volání metod služeb vašich služeb zde

transactionScope.Complete ();

  }

}

chytit

{

// Sem napište kód pro zpracování výjimek

}

A to je vše, co musíte udělat. Nyní můžete spustit svou aplikaci a otestovat své transakční služby.