Как да работя с транзакционни WCF услуги

WCF (Windows Communication Foundation) е сигурна, надеждна и мащабируема платформа за съобщения за разработване на услуги в .Net.

Транзакцията е набор от изрази, които се изпълняват, следвайки принципите на ACID (ACID означава атомни, последователни, изолирани и трайни операции). Когато една от операциите в блока на транзакциите се провали, цялата транзакция се прекъсва, т.е. цялата транзакция се проваля. WCF осигурява поддръжка за разпределени транзакционни операции. Можете да използвате класа TransactionScope, присъстващ в пространството от имена System.Transaction за ефективно управление на транзакциите при работа в .Net.

Внедряване на WCF транзакции

В този раздел ще проучим как можем да създадем транзакционни WCF услуги. За да започнете, създайте две WCF услуги. Можете също да създадете друг проект (конзола или уеб проект), за да тествате услугите си. След като двете WCF услуги са създадени, трябва да украсите операционните договори, които биха били част от транзакцията, с атрибута TransactionFlow. Това е необходимо, за да се даде възможност за поддръжка на транзакции.

Този атрибут приема изброяването TransactionFlowOption като параметър. TransactionFlowOption може да има една от следните стойности:

  • TransactionFlowOption.Allowed
  • TransactionFlowOption.Задължително
  • TransactionFlowOption.NotAllowed

Когато работите с WCF, първо трябва да създадете договор за услуга и след това да дефинирате операциите за услуги или договори за операции в него. Имате много различни видове договори в WCF - договори за услуги, договори за данни, договори за грешки, договори за съобщения и договори за експлоатация. В този пример ще използваме договори за услуги и договори за експлоатация, тъй като другите могат да бъдат по избор. ServiceContract се използва за указване на операциите, които клиентът на услугата може да използва. В този раздел ще създадем два договора за услуги за двете услуги на WCF, които използваме.

Следният кодов фрагмент илюстрира как можете да конфигурирате атрибута TransactionFlow във вашия договор за услуга на WCF, за да осигурите транзакционна поддръжка. Имайте предвид, че трябва да направите същото и в другите договори за операция (които са част от транзакцията).

[ServiceContract]

public interface IOrderService

{

    [OperationContract]

    [TransactionFlow(TransactionFlowOption.Allowed  )]

    void AddOrder(Order order);

}

Имайте предвид, че всеки договор за услуга трябва да има един или повече договори за операция, за да дефинира операциите, които са изложени по жицата. Договорът за операция се използва за дефиниране на подписването на метода на услугата, а също и на транзакционния поток, посоката на операцията на услугата и по избор всеки договор (и) за неизправност, който може да бъде свързан.

Ето как би изглеждал интерфейсът IOrderHeaderService (договор за услуга).

[ServiceContract]

public interface IOrderHeaderService

{

    [OperationContract]

    [TransactionFlow(TransactionFlowOption.Allowed  )]

    void AddOrderHeader(OrderHeader orderHeader);

}

След това трябва да се уверите, че методът на вашата услуга е украсен с TransactionScopeRequired с помощта на атрибута OperationBehavior. По същество трябва да зададете свойството TransactionScopeRequired на „true“ в договора за операция, както е показано в кодовия фрагмент по-долу. Изявлението TransactionScopeRequired = true се използва за указване, че операцията на услугата се нуждае от обхват на транзакцията, за да бъде изпълнен.

[OperationBehavior(TransactionScopeRequired = true)]

public void AddOrder(Order order)

{

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

}

Същата промяна се отнася и за другата операция по обслужване.

[OperationBehavior(TransactionScopeRequired = true)]

public void AddOrderHeader(OrderHeader orderHeader)

{

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

}

Следващата стъпка е да конфигурирате конфигурационния файл на вашата услуга, за да активирате потока на транзакциите. Ако приемем, че използвате wsHttpBinding, ето как можете да конфигурирате вашата WCF услуга да предоставя поддръжка на потока на транзакциите.

Имайте предвид, че когато работите с транзакционни WCF услуги, можете по желание да посочите надеждни съобщения, за да намалите възможността за прекратени транзакции поради неуспешни комуникации. Трябва също така да конфигурирате вашите крайни точки на услугата WCF, за да използвате свързването, което току що дефинирахме.

                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.