Cara bekerja dengan perkhidmatan WCF transaksional

WCF (Windows Communication Foundation) adalah platform pesanan selamat, boleh dipercayai, dan berskala untuk mengembangkan perkhidmatan di .Net.

Transaksi adalah sekumpulan pernyataan yang dilaksanakan dengan mengikuti prinsip-prinsip ACID (ACID bermaksud operasi Atom, Konsisten, Terpencil, dan Tahan Lama). Apabila salah satu operasi dalam blok transaksi gagal, keseluruhan transaksi dibatalkan, iaitu keseluruhan transaksi gagal. WCF memberikan sokongan untuk operasi transaksi yang diedarkan. Anda boleh memanfaatkan kelas TransactionScope yang terdapat di System.Transactions namespace untuk pengurusan transaksi yang cekap ketika bekerja di .Net.

Melaksanakan transaksi WCF

Di bahagian ini kita akan meneroka bagaimana kita boleh membuat perkhidmatan WCF transaksional. Untuk memulakan, buat dua perkhidmatan WCF. Anda juga boleh membuat projek lain (konsol atau projek web) untuk menguji perkhidmatan anda. Setelah dua perkhidmatan WCF dibuat, anda harus menghiasi kontrak operasi yang akan menjadi sebahagian daripada transaksi dengan atribut TransactionFlow. Ini diperlukan untuk membolehkan sokongan transaksi.

Atribut ini menerima enum TransactionFlowOption sebagai parameter. TransactionFlowOption boleh mempunyai salah satu nilai berikut:

  • TransactionFlowOption. Dibolehkan
  • TransactionFlowOption.Mandatory
  • TransactionFlowOption.Tidak Dibolehkan

Semasa bekerja dengan WCF, pertama anda perlu membuat kontrak perkhidmatan dan kemudian menentukan operasi operasi atau kontrak operasi di dalamnya. Anda mempunyai banyak jenis kontrak dalam WCF - kontrak perkhidmatan, kontrak data, kontrak kesalahan, kontrak pesanan dan kontrak operasi. Dalam contoh ini kita akan menggunakan kontrak perkhidmatan dan kontrak operasi kerana yang lain boleh menjadi pilihan. ServiceContract digunakan untuk menentukan operasi yang tersedia untuk digunakan oleh pelanggan perkhidmatan. Di bahagian ini kami akan membuat dua kontrak perkhidmatan untuk dua perkhidmatan WCF yang kami gunakan.

Coretan kod berikut menggambarkan bagaimana anda dapat mengkonfigurasi atribut TransactionFlow dalam kontrak perkhidmatan WCF anda untuk memberikan sokongan transaksi. Perhatikan bahawa anda juga perlu melakukan perkara yang sama dalam kontrak operasi lain (yang merupakan sebahagian daripada transaksi) juga.

[ServiceContract]

public interface IOrderService

{

    [OperationContract]

    [TransactionFlow(TransactionFlowOption.Allowed  )]

    void AddOrder(Order order);

}

Perhatikan bahawa setiap kontrak perkhidmatan harus mempunyai satu atau lebih kontrak operasi untuk menentukan operasi yang terdedah melalui wayar. Kontrak operasi digunakan untuk menentukan tanda tangan kaedah perkhidmatan dan juga aliran transaksi, arah operasi perkhidmatan dan secara opsional, setiap kontrak kesalahan yang mungkin berkaitan.

Inilah rupa antara muka IOrderHeaderService (kontrak perkhidmatan).

[ServiceContract]

public interface IOrderHeaderService

{

    [OperationContract]

    [TransactionFlow(TransactionFlowOption.Allowed  )]

    void AddOrderHeader(OrderHeader orderHeader);

}

Seterusnya, anda harus memastikan bahawa kaedah perkhidmatan anda dihiasi dengan TransactionScopeRequired menggunakan atribut OperationBehavior. Pada dasarnya, anda harus menetapkan harta TransactionScopeRequired menjadi "true" dalam kontrak operasi seperti yang ditunjukkan dalam coretan kod di bawah. Pernyataan TransactionScopeRequired = true digunakan untuk menentukan bahawa operasi perkhidmatan memerlukan skop transaksi untuk dilaksanakan.

[OperationBehavior(TransactionScopeRequired = true)]

public void AddOrder(Order order)

{

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

}

Perubahan yang sama berlaku untuk operasi perkhidmatan yang lain juga.

[OperationBehavior(TransactionScopeRequired = true)]

public void AddOrderHeader(OrderHeader orderHeader)

{

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

}

Langkah seterusnya adalah mengkonfigurasi fail konfigurasi perkhidmatan anda untuk mengaktifkan aliran transaksi. Dengan andaian bahawa anda menggunakan wsHttpBinding, inilah cara anda dapat mengkonfigurasi perkhidmatan WCF anda untuk memberikan sokongan aliran transaksi.

Perhatikan bahawa semasa bekerja dengan perkhidmatan WCF transaksional, anda boleh menentukan pesanan yang boleh dipercayai untuk mengurangkan kemungkinan urus niaga yang digugurkan kerana kegagalan komunikasi. Anda juga harus mengkonfigurasi titik akhir perkhidmatan WCF anda agar dapat memanfaatkan ikatan yang baru 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.