Bagaimana bekerja dengan layanan WCF transaksional

WCF (Windows Communication Foundation) adalah platform perpesanan yang aman, andal, dan dapat diskalakan untuk mengembangkan layanan di .Net.

Transaksi adalah sekumpulan pernyataan yang dijalankan dengan mengikuti prinsip ACID (ACID adalah singkatan dari Atomic, Consistent, Isolated, dan Durable operations). Ketika salah satu operasi dalam blok transaksi gagal, seluruh transaksi dibatalkan, yaitu seluruh transaksi gagal. WCF memberikan dukungan untuk operasi transaksional terdistribusi. Anda dapat memanfaatkan kelas TransactionScope yang ada di ruang nama System.Transactions untuk manajemen transaksi yang efisien saat bekerja di .Net.

Menerapkan transaksi WCF

Pada bagian ini kita akan mengeksplorasi bagaimana kita dapat membuat layanan WCF transaksional. Untuk memulai, buat dua layanan WCF. Anda juga dapat membuat proyek lain (konsol atau proyek web) untuk menguji layanan Anda. Setelah dua layanan WCF dibuat, Anda harus menghias kontrak operasi yang akan menjadi bagian dari transaksi dengan atribut TransactionFlow. Ini diperlukan untuk mengaktifkan dukungan transaksi.

Atribut ini menerima enum TransactionFlowOption sebagai parameter. TransactionFlowOption dapat memiliki salah satu dari nilai berikut:

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

Saat bekerja dengan WCF, Anda harus terlebih dahulu membuat kontrak layanan dan kemudian menentukan operasi layanan atau kontrak operasi di dalamnya. Anda memiliki berbagai jenis kontrak dalam WCF - kontrak layanan, kontrak data, kontrak kesalahan, kontrak pesan, dan kontrak operasi. Dalam contoh ini kami akan menggunakan kontrak layanan dan kontrak operasi karena yang lain dapat bersifat opsional. ServiceContract digunakan untuk menentukan operasi yang tersedia untuk digunakan klien layanan. Pada bagian ini kami akan membuat dua kontrak layanan untuk dua layanan WCF yang kami gunakan.

Cuplikan kode berikut mengilustrasikan bagaimana Anda dapat mengonfigurasi atribut TransactionFlow di kontrak layanan WCF Anda untuk memberikan dukungan transaksional. Perhatikan bahwa Anda perlu melakukan hal yang sama di kontrak operasi lainnya (yang merupakan bagian dari transaksi) juga.

[ServiceContract]

public interface IOrderService

{

    [OperationContract]

    [TransactionFlow(TransactionFlowOption.Allowed  )]

    void AddOrder(Order order);

}

Perhatikan bahwa setiap kontrak layanan harus memiliki satu atau lebih kontrak operasi untuk menentukan operasi yang diekspos melalui kabel. Kontrak operasi digunakan untuk menentukan tanda tangan dari metode layanan dan juga aliran transaksi, arah operasi layanan dan secara opsional, kontrak kesalahan apa pun yang mungkin terkait.

Berikut tampilan antarmuka IOrderHeaderService (kontrak layanan).

[ServiceContract]

public interface IOrderHeaderService

{

    [OperationContract]

    [TransactionFlow(TransactionFlowOption.Allowed  )]

    void AddOrderHeader(OrderHeader orderHeader);

}

Selanjutnya, Anda harus memastikan bahwa metode layanan Anda didekorasi dengan TransactionScopeRequired menggunakan atribut OperationBehavior. Intinya, Anda harus menyetel properti TransactionScopeRequired ke "true" dalam kontrak operasi seperti yang ditunjukkan pada cuplikan kode di bawah. Pernyataan TransactionScopeRequired = true digunakan untuk menetapkan bahwa operasi layanan memerlukan cakupan transaksi untuk dijalankan.

[OperationBehavior(TransactionScopeRequired = true)]

public void AddOrder(Order order)

{

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

}

Perubahan yang sama juga berlaku untuk operasi layanan lainnya.

[OperationBehavior(TransactionScopeRequired = true)]

public void AddOrderHeader(OrderHeader orderHeader)

{

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

}

Langkah selanjutnya adalah mengonfigurasi file konfigurasi layanan Anda untuk mengaktifkan aliran transaksi. Dengan asumsi bahwa Anda menggunakan wsHttpBinding, berikut ini cara mengonfigurasi layanan WCF Anda untuk menyediakan dukungan aliran transaksi.

Perhatikan bahwa ketika bekerja dengan layanan WCF transaksional, Anda dapat secara opsional menentukan pesan yang andal untuk mengurangi kemungkinan transaksi yang dibatalkan karena kegagalan komunikasi. Anda juga harus mengonfigurasi titik akhir layanan WCF Anda sesuai untuk memanfaatkan pengikatan yang baru saja kami tentukan.

                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.