Kako raditi s transakcijskim WCF uslugama

WCF (Windows Communication Foundation) je sigurna, pouzdana i skalabilna platforma za razmjenu poruka za razvoj usluga u .Netu.

Transakcija je skup izjava koji se izvršavaju slijedeći načela ACID (ACID je kratica za atomske, dosljedne, izolirane i trajne operacije). Kada jedna od operacija u bloku transakcija zakaže, cijela transakcija se prekida, tj. Cijela transakcija ne uspijeva. WCF pruža podršku za distribuirane transakcijske operacije. Možete iskoristiti klasu TransactionScope prisutnu u prostoru imena System.Transaction za učinkovito upravljanje transakcijama kada radite u .Net-u.

Provedba WCF transakcija

U ovom ćemo odjeljku istražiti kako možemo stvoriti transakcijske WCF usluge. Za početak stvorite dvije WCF usluge. Također možete stvoriti drugi projekt (konzolu ili web projekt) kako biste testirali svoje usluge. Jednom kada su kreirane dvije WCF usluge, trebali biste ukrasiti ugovore o operacijama koji bi bili dio transakcije atributom TransactionFlow. To je potrebno kako bi se omogućila podrška za transakcije.

Ovaj atribut prihvaća nabrajanje TransactionFlowOption kao parametar. TransactionFlowOption može imati jednu od sljedećih vrijednosti:

  • TransactionFlowOption.Allowed
  • TransactionFlowOption.Obavezno
  • TransactionFlowOption.NotAllowed

Kada radite s WCF-om, prvo morate stvoriti ugovor o usluzi, a zatim u njemu definirati servisne operacije ili operativne ugovore. U WCF-u imate mnogo različitih vrsta ugovora - ugovori o uslugama, ugovori o podacima, ugovori o greškama, ugovori o porukama i ugovori o operacijama. U ovom ćemo primjeru koristiti ugovore o uslugama i ugovore o operacijama, jer ostali mogu biti neobavezni. ServiceContract koristi se za određivanje operacija koje su na raspolaganju klijentu usluge. U ovom ćemo odjeljku stvoriti dva ugovora o uslugama za dvije usluge WCF-a koje koristimo.

Sljedeći isječak koda ilustrira kako možete konfigurirati atribut TransactionFlow u ugovoru o usluzi WCF-a da biste pružili transakcijsku podršku. Imajte na umu da isto trebate učiniti i u ostalim operativnim ugovorima (koji su dio transakcije).

[ServiceContract]

public interface IOrderService

{

    [OperationContract]

    [TransactionFlow(TransactionFlowOption.Allowed  )]

    void AddOrder(Order order);

}

Imajte na umu da bi svaki ugovor o usluzi trebao imati jedan ili više operativnih ugovora za definiranje operacija koje su izložene preko žice. Ugovor o operaciji koristi se za definiranje potpisa metode usluge, a također i tijek transakcije, smjer rada usluge i, prema želji, svi ugovori o greškama koji mogu biti povezani.

Evo kako bi izgledalo sučelje IOrderHeaderService (ugovor o usluzi).

[ServiceContract]

public interface IOrderHeaderService

{

    [OperationContract]

    [TransactionFlow(TransactionFlowOption.Allowed  )]

    void AddOrderHeader(OrderHeader orderHeader);

}

Dalje, trebali biste osigurati da vaša metoda usluge bude ukrašena TransactionScopeRequired pomoću atributa OperationBehavior. U osnovi, trebali biste svojstvo TransactionScopeRequired postaviti na "true" u operacijskom ugovoru, kao što je prikazano u isječku koda u nastavku. Izraz TransactionScopeRequired = true koristi se za specificiranje da operacija usluge treba izvršiti opseg transakcije.

[OperationBehavior(TransactionScopeRequired = true)]

public void AddOrder(Order order)

{

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

}

Ista promjena odnosi se i na drugu uslugu.

[OperationBehavior(TransactionScopeRequired = true)]

public void AddOrderHeader(OrderHeader orderHeader)

{

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

}

Sljedeći je korak konfiguriranje datoteke konfiguracije usluge kako biste omogućili tijek transakcija. Pod pretpostavkom da koristite wsHttpBinding, evo kako možete konfigurirati svoju WCF uslugu da pruža podršku za protok transakcija.

Imajte na umu da pri radu s transakcijskim WCF uslugama po želji možete odrediti pouzdane poruke kako biste umanjili mogućnost pokidanih transakcija uslijed komunikacijskih kvarova. Također biste trebali konfigurirati svoje krajnje točke WCF usluge kako biste iskoristili vezanje koje smo upravo definirali.

                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.