Penanganan pengecualian di WCF

Pengecualian adalah kesalahan yang terjadi pada waktu proses; penanganan pengecualian adalah teknik menangani error runtime ini. Anda biasanya akan menggunakan coba, tangkap, dan terakhir blok (juga dikenal sebagai blok pengecualian) dalam kode aplikasi Anda untuk menangani pengecualian. Jika pengecualian tidak ditangani dengan benar dalam kode aplikasi dan pengecualian terjadi pada waktu proses, eksekusi aplikasi akan dihentikan.

Penanganan pengecualian di WCF tidak begitu mudah - Anda dibatasi untuk mengirim objek .Net melalui kabel dan layanan WCF Anda hanya dapat mengirim data serial, yaitu pesan SOAP ke klien. Anda dapat menangani pengecualian di WCF dengan salah satu dari tiga cara berikut:

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

Dalam posting ini, saya akan menyajikan diskusi tentang berbagai cara pengiriman pesan pengecualian dari layanan WCF ke konsumen layanan.

Pertimbangkan layanan WCF sederhana ini.

[ServiceContract]

antarmuka publik IDBManagerService

    {

        [OperationContract]

        void Save (Karyawan emp);

    }

Kontrak layanan IDBManagerService berisi satu kontrak operasi untuk mempertahankan objek karyawan ke database.

public class DBManagerService: IDBManagerService

    {

        void Save (Karyawan emp)

        {

         mencoba

           {

            // Kode untuk menyimpan objek karyawan ke database

           }

           catch (Exception ex)

           {

               membuang Pengecualian baru (“Terjadi kesalahan saat menyimpan data…”);

           }

        }

    }

Sekarang misalkan ada kesalahan saat menyambungkan ke database atau menyimpan objek karyawan ke database pada saat Anda mencoba menggunakan layanan. Anda kemudian akan mendapatkan pengecualian dengan pesan ini: "System.ServiceModel.FaultException: Server tidak dapat memproses permintaan karena kesalahan internal. Untuk informasi lebih lanjut tentang kesalahan, aktifkan IncludeExceptionDetailInFaults (baik dari ServiceBehaviorAttribute atau dari konfigurasi perilaku) di server untuk mengirim informasi pengecualian kembali ke klien, atau mengaktifkan pelacakan sesuai dokumentasi Microsoft .Net Framework 3.0 SDK dan memeriksa log pelacakan server. "

Anda dapat menggunakan setel elemen includeExceptionDetailInFaults ke true di file web.config sehingga detail tambahan dari pengecualian disertakan dalam kesalahan agar lebih mudah bagi Anda untuk memeriksa apa yang sebenarnya salah.

Anda juga dapat melakukannya dengan menulis kode. Berikut adalah cuplikan kode yang menggambarkan bagaimana Anda dapat menyetel properti ini ke true.

    typeof (ServiceDebugBehavior));

    ServiceDebugBehavior baru {IncludeExceptionDetailInFaults = true});

Anda juga dapat menyetel ini ke true menggunakan tag ServiceBehavior seperti yang ditunjukkan di bawah ini.

[ServiceBehavior (IncludeExceptionDetailInFaults = true)]

public class DBManagerService: IDBManagerService

{

}

Saat Anda mencoba menggunakan layanan ini lagi, Anda akan melihat pesan pengecualian yang lebih tepat.

Menggunakan FaultException

Namun, jika Anda perlu meneruskan pesan pengecualian ramah pengguna dari layanan, Anda harus melempar pengecualian kesalahan. Pengecualian kesalahan adalah pengecualian yang diberikan oleh layanan WCF ketika pengecualian terjadi pada waktu proses - pengecualian semacam itu biasanya digunakan untuk mengirimkan data kesalahan yang tidak diketik ke konsumen layanan. Anda dapat menangani pengecualian dalam metode layanan Anda dengan cara yang sama seperti yang Anda lakukan dengan metode lain dan kemudian mengubahnya menjadi pengecualian kesalahan.

Cuplikan kode di bawah ini menunjukkan metode layanan yang diperbarui - metode layanan sekarang menampilkan pengecualian kesalahan.

public class DBManagerService: IDBManagerService

    {

        void Save (Karyawan emp)

        {

            mencoba

            {

               // Kode untuk menyimpan objek karyawan ke database

            }

            catch (Exception ex)

            {

               melempar FaultException baru ("Terjadi kesalahan saat menyimpan data ...");

            }

        }

    }

Anda sekarang perlu menangani pengecualian kesalahan dalam kode Anda saat menggunakan layanan ini. Anda dapat mempelajari lebih lanjut tentang pengecualian kesalahan di WCF dari artikel MSDN ini.

Anda juga bisa membuat kelas kesalahan kustom yang ditandai dengan atribut DataContract.

[DataContract]

kelas publik CustomFault

{

[Anggota Data]

Sumber string publik;

[Anggota Data]

string publik ExceptionMessage;

[Anggota Data]

public string InnerException;

[Anggota Data]

string publik StackTrace;

}

Cuplikan kode berikut mengilustrasikan bagaimana Anda dapat menggunakan kelas CustomFault untuk menampilkan FaultException yang diketik dengan kuat.

void Save (Karyawan emp)

{

mencoba

{

  // Kode untuk menyimpan objek karyawan ke dalam database

}

catch (Exception ex)

{

CustomFault cx = New CustomFault ();

membuang FaultException baru (mis., FaultReason baru ("Ini adalah pengecualian kesalahan yang diketik dengan kuat"));

}

}

Anda juga perlu menentukan atribut FaultContract pada metode layanan Anda yang akan memunculkan FaultException. Metode Simpan yang dimodifikasi akan terlihat seperti ini.

[ServiceContract]

antarmuka publik IDBManagerService

    {

        [OperationContract]

        [FaultContract]

        void Save (Karyawan emp);

    }

Menggunakan returnUnknownExceptionsAsFaults

Anda dapat menggunakan atribut returnUnknownExceptionsAsFaults dalam konfigurasi perilaku layanan untuk memunculkan pengecualian sebagai kesalahan SOAP secara otomatis. Cuplikan kode berikut mengilustrasikan bagaimana Anda bisa mencapai ini.

                 returnUnknownExceptionsAsFaults = "True">

Menangani pengecualian secara global

Cara lain untuk menangani pengecualian di WCF adalah dengan mengimplementasikan antarmuka IErrorHandler pada kelas layanan Anda untuk menangani semua pengecualian secara global dan menyediakan FaultException yang sesuai dengan SOAP. Antarmuka ini berisi dua metode - HandleError dan ProvidFault. Sementara yang pertama digunakan untuk melakukan beberapa aktivitas dengan kesalahan, yang terakhir digunakan untuk mengembalikan pesan kesalahan. Perhatikan bahwa Anda juga dapat mengonfigurasi IErrorHandler (mengaktifkan atau menonaktifkannya) di file yang dapat dikonfigurasi layanan Anda.