Pengendalian pengecualian di WCF

Pengecualian adalah kesilapan yang berlaku pada waktu runtime; pengecualian pengendalian adalah teknik menangani kesalahan runtime ini. Anda biasanya menggunakan cubaan, tangkapan, dan akhirnya blok (juga dikenali sebagai blok pengecualian) dalam kod aplikasi anda untuk menangani pengecualian. Sekiranya pengecualian tidak ditangani dengan betul dalam kod aplikasi dan pengecualian telah berlaku pada waktu runtime, pelaksanaan aplikasi akan berakhir.

Pengendalian pengecualian di WCF tidak begitu cepat - anda terpaksa mengirim. Objek bersih melalui wayar dan perkhidmatan WCF anda hanya dapat mengirim data bersiri, iaitu, pesanan SOAP kepada pelanggan. Anda boleh menangani pengecualian dalam WCF dengan salah satu daripada tiga cara berikut:

  1. Menggunakan FaultException
  2. Menggunakan IErrorHandler
  3. Menggunakan returnUnknownExceptionsAsFaults

Dalam catatan ini, saya akan menyampaikan perbincangan mengenai pelbagai cara di mana mesej pengecualian dapat dihantar dari perkhidmatan WCF kepada pengguna perkhidmatan tersebut.

Pertimbangkan perkhidmatan WCF sederhana ini.

[Kontrak khidmat]

antara muka awam IDBManagerService

    {

        [Operasi Kontrak]

        batal Simpan (Pekerja empayar);

    }

Kontrak perkhidmatan IDBManagerService mengandungi satu kontrak operasi untuk meneruskan objek pekerja ke pangkalan data.

kelas awam DBManagerService: IDBManagerService

    {

        batal Simpan (Pekerja empayar)

        {

         cuba

           {

            // Kod untuk menyimpan objek pekerja ke pangkalan data

           }

           tangkapan (Pengecualian ex)

           {

               membuang Pengecualian baru ("Ralat berlaku semasa menyimpan data ...");

           }

        }

    }

Sekarang anggap ada ralat semasa menyambung ke pangkalan data atau menyimpan objek pekerja ke pangkalan data pada masa anda cuba menggunakan perkhidmatan tersebut. Anda kemudian akan mendapat pengecualian dengan mesej ini: "System.ServiceModel.FaultException: Pelayan tidak dapat memproses permintaan kerana ralat dalaman. Untuk maklumat lebih lanjut mengenai ralat, hidupkan IncludeExceptionDetailInFaults (sama ada dari ServiceBehaviorAttribute atau dari konfigurasi tingkah laku) pada pelayan untuk mengirim kembali maklumat pengecualian kepada klien, atau aktifkan penelusuran mengikut dokumentasi Microsoft .Net Framework 3.0 SDK dan periksa log jejak pelayan. "

Anda boleh menggunakan set elemen includeExceptionDetailInFaults menjadi benar dalam fail web.config sehingga butiran tambahan pengecualian dimasukkan ke dalam kesalahan untuk menjadikannya lebih mudah bagi anda untuk memeriksa apa yang sebenarnya salah.

Anda juga boleh mencapainya dengan menulis kod. Berikut adalah coretan kod yang menggambarkan bagaimana anda boleh menetapkan harta ini menjadi benar.

    typeof (ServiceDebugBehavior));

    ServiceDebugBehavior baru {IncludeExceptionDetailInFaults = true});

Anda juga dapat menetapkan ini menjadi benar menggunakan tag ServiceBehavior seperti yang ditunjukkan di bawah.

[ServiceBehavior (IncludeExceptionDetailInFaults = benar)]

kelas awam DBManagerService: IDBManagerService

{

}

Apabila anda cuba menggunakan perkhidmatan ini lagi, anda akan melihat mesej pengecualian yang lebih tepat.

Menggunakan FaultException

Walau bagaimanapun, jika anda perlu menyampaikan mesej pengecualian yang mesra pengguna dari perkhidmatan, anda harus membuang pengecualian kesalahan. Pengecualian kesalahan adalah pengecualian yang dilemparkan oleh perkhidmatan WCF apabila pengecualian berlaku pada waktu berjalan - pengecualian seperti ini biasanya digunakan untuk menghantar data kesalahan yang tidak diketik kepada pengguna perkhidmatan. Anda boleh menangani pengecualian dalam kaedah perkhidmatan anda dengan cara yang sama seperti kaedah lain dan kemudian mengubahnya menjadi pengecualian kesalahan.

Coretan kod di bawah menunjukkan kaedah perkhidmatan yang dikemas kini - kaedah perkhidmatan sekarang membuang pengecualian kesalahan.

kelas awam DBManagerService: IDBManagerService

    {

        batal Simpan (Pekerja empayar)

        {

            cuba

            {

               // Kod untuk menyimpan objek pekerja ke pangkalan data

            }

            tangkapan (Pengecualian ex)

            {

               membuang FaultException baru ("Ralat berlaku semasa menyimpan data ...");

            }

        }

    }

Anda sekarang perlu menangani pengecualian kesalahan dalam kod anda semasa menggunakan perkhidmatan ini. Anda boleh mengetahui lebih lanjut mengenai pengecualian kesalahan di WCF dari artikel MSDN ini.

Anda juga boleh membuat kelas kesalahan khusus yang ditandai dengan atribut DataContract.

[Kontrak Data]

kelas awam CustomFault

{

[Ahli Data]

tali rentetan awam;

[Ahli Data]

rentetan awam ExceptionMessage;

[Ahli Data]

rentetan awam InnerException;

[Ahli Data]

rentetan awam StackTrace;

}

Coretan kod berikut menggambarkan bagaimana anda boleh menggunakan kelas CustomFault untuk membuang FaultException yang ditaip dengan kuat.

batal Simpan (Pekerja empayar)

{

cuba

{

  // Kod untuk menyimpan objek pekerja ke dalam pangkalan data

}

tangkapan (Pengecualian ex)

{

CustomFault cx = CustomFault baru ();

lemparkan FaultException baru (mis., FaultReason baru ("Ini adalah pengecualian kesalahan yang ditaip kuat"));

}

}

Anda juga perlu menentukan atribut FaultContract pada kaedah perkhidmatan anda yang akan meningkatkan FaultException. Kaedah Simpan yang diubah akan kelihatan seperti ini.

[Kontrak khidmat]

antara muka awam IDBManagerService

    {

        [Operasi Kontrak]

        [Kesalahan Kontrak]

        batal Simpan (Pekerja empayar);

    }

Menggunakan returnUnknownExceptionsAsFaults

Anda boleh menggunakan atribut returnUnknownExceptionsAsFaults dalam konfigurasi tingkah laku perkhidmatan untuk meningkatkan pengecualian sebagai kesalahan SOAP secara automatik. Coretan kod berikut menggambarkan bagaimana anda dapat mencapainya.

                 returnUnknownExceptionsAsFaults = "Betul">

Mengendalikan pengecualian di peringkat global

Cara lain untuk menangani pengecualian di WCF adalah dengan menerapkan antara muka IErrorHandler pada kelas perkhidmatan anda untuk menangani semua pengecualian di peringkat global dan menyediakan FaultException yang mematuhi SOAP. Antaramuka ini mengandungi dua kaedah - HandleError dan SupplyFault. Walaupun yang pertama digunakan untuk melakukan beberapa aktiviti dengan kesalahan, yang terakhir digunakan untuk mengembalikan pesan kesalahan. Perhatikan bahawa anda juga boleh mengkonfigurasi IErrorHandler (menghidupkan atau mematikannya) dalam fail yang boleh dikonfigurasi oleh perkhidmatan anda.