Bagaimana menangani kesalahan di ASP.NET Web API

API Web ASP.NET Microsoft adalah kerangka kerja ringan yang dapat Anda gunakan untuk membangun layanan RESTful tanpa negara yang berjalan di HTTP. Pengecualian adalah kesalahan yang terjadi pada waktu proses, dan penanganan pengecualian adalah teknik menangani kesalahan waktu proses dalam kode aplikasi Anda.

Setiap pengembang ASP.NET Web API harus mengetahui cara menangani pengecualian di API Web dan cara mengirimkan kode kesalahan dan pesan kesalahan yang sesuai dari metode pengontrol API Web. Kami akan memeriksa bagaimana melakukan tugas-tugas ini pada bagian di bawah ini. 

Menggunakan HttpResponseException di ASP.NET Web API

Anda dapat menggunakan kelas HttpResponseException untuk mengembalikan kode status HTTP tertentu dan pesan dari metode pengontrol Anda di Web API. Berikut ini contohnya.

Public Employee GetEmployee (int id)

{

    Emp karyawan = employeeRepository.Get (id);

    jika (emp == null)

    {

        var response = new HttpResponseMessage (HttpStatusCode.NotFound)

        {

            Konten = baru StringContent ("Karyawan tidak ada", System.Text.Encoding.UTF8, "teks / biasa"),

            StatusCode = HttpStatusCode.NotFound

        }

        melempar HttpResponseException baru (respon);

    }

    kembali emp;

}

Jika API Web Anda mengembalikan IHttpActionResult, Anda mungkin ingin menulis metode GetEmployee seperti yang ditunjukkan di bawah ini.

publik IHttpActionResult GetEmployee (int id)

{

    Emp karyawan = employeeRepository.Get (id);

    jika (emp == null)

    {

        var response = new HttpResponseMessage (HttpStatusCode.NotFound)

        {

            Konten = baru StringContent ("Karyawan tidak ada", System.Text.Encoding.UTF8, "teks / biasa"),

            StatusCode = HttpStatusCode.NotFound

        }

        melempar HttpResponseException baru (respon);

    }

    kembali Ok (emp);

}

Perhatikan bahwa kode kesalahan dan pesan kesalahan ditetapkan ke objek respons, dan bahwa contoh HttpResponseException dikembalikan saat pengecualian terjadi dalam metode tindakan pengontrol API Web.

Menggunakan HttpError di ASP.NET Web API

Anda dapat menggunakan metode ekstensi CreateErrorResponse dalam metode pengontrol API Web untuk mengembalikan kode kesalahan dan pesan kesalahan yang berarti. Perhatikan bahwa metode CreateErrorResponse membuat objek HttpError dan kemudian membungkusnya di dalam objek HttpResponseMessage.

Daftar kode berikut menggambarkan bagaimana Anda dapat menggunakan metode ekstensi CreateErrorResponse dari metode tindakan pengontrol API Web Anda.

publik IActionResult GetEmployee (int id)

{

    Emp karyawan = employeeRepository.Get (id);

    jika (emp == null)

    {

       string message = "Karyawan tidak ada";

        lemparkan HttpResponseException baru (

            Request.CreateErrorResponse (HttpStatusCode.NotFound, pesan));

    }

    kembali Ok (emp);

}

Lihat metode GetEmployee () yang ditunjukkan di atas. Metode ini menerima ID karyawan sebagai parameter dan menggunakan ID ini untuk mencari dan mengambil catatan karyawan menggunakan instance repositori karyawan. Jika rekaman karyawan yang memiliki ID karyawan yang ditentukan tidak ditemukan, instance HttpResponseException akan dilempar. Perhatikan bagaimana pesan kesalahan dan kode kesalahan dibuat sebelum contoh pengecualian dilempar dari metode pengontrol API Web.

Menggunakan filter pengecualian di ASP.NET Web API

Filter pengecualian adalah filter yang dapat digunakan untuk menangani pengecualian tidak tertangani yang dihasilkan dalam metode pengontrol API Web Anda. Dengan kata lain, Anda dapat menggunakan filter pengecualian untuk menangkap pengecualian yang tidak tertangani di API Web yang berasal dari metode pengontrol Anda. Perhatikan bahwa filter kesalahan global adalah pendekatan yang baik untuk menangani pengecualian di API Web Anda jika pengecualian yang tidak tertangani dilempar dan tidak ditangani dalam metode pengontrol Anda.

Untuk membuat filter pengecualian, Anda perlu menerapkan antarmuka IExceptionFilter. Anda juga dapat membuat filter pengecualian dengan memperluas kelas abstrak ExceptionFilterAttribute lalu mengganti metode OnException. Perhatikan bahwa kelas abstrak ExceptionFilterAttribute pada gilirannya mengimplementasikan antarmuka IExceptionFilter.

Cuplikan kode berikut mengilustrasikan bagaimana Anda dapat membuat filter pengecualian kustom dengan memperluas kelas ExceptionFilterAttribute lalu mengganti metode OnException. Perhatikan bagaimana pengecualian standar yang dilemparkan oleh metode pengontrol Anda ditangkap oleh filter pengecualian kustom dan kemudian diubah menjadi objek HttpStatusResponse dengan HttpStatusCode yang sesuai.

kelas publik CustomExceptionFilter: ExceptionFilterAttribute

    {

        public override void OnException (HttpActionExecutedContext actionExecutedContext)

        {

            HttpStatusCode status = HttpStatusCode.InternalServerError;

            Pesan string = String.Empty;

            var exceptionType = actionExecutedContext.Exception.GetType ();

            if (exceptionType == typeof (UnauthorizedAccessException))

            {

                message = "Akses ke API Web tidak diizinkan.";

                status = HttpStatusCode.Unauthorized;

            }

            lain jika (exceptionType == typeof (DivideByZeroException))

            {

                message = "Kesalahan Server Internal.";

                status = HttpStatusCode.InternalServerError;

            }

            lain

            {

                message = "Tidak ditemukan.";

                status = HttpStatusCode.NotFound;

            }

            actionExecutedContext.Response = HttpResponseMessage () baru

            {

                Konten = StringContent baru (pesan, System.Text.Encoding.UTF8, "teks / biasa"),

                StatusCode = status

            };

            base.OnException (actionExecutedContext);

        }

    }

Anda harus menambahkan filter pengecualian khusus ke koleksi filter dari objek HttpConfiguration.

public static void Register (konfigurasi HttpConfiguration)

        {

            config.MapHttpAttributeRoutes ();

            config.Routes.MapHttpRoute (

                nama: "DefaultApi",

                routeTemplate: "api / {controller} / {id}",

                default: baru {id = RouteParameter.Optional}

            );

            config.Formatters.Remove (config.Formatters.XmlFormatter);

            config.Filters.Add (new CustomExceptionFilter ());

        }

Anda dapat mendaftarkan filter pengecualian Anda dengan salah satu dari tiga cara berikut:

  • Di level aksi
  • Di level pengontrol
  • Secara global

Cuplikan kode berikut menunjukkan bagaimana Anda dapat menerapkan filter pada tingkat tindakan, yaitu, ke metode tindakan pengontrol Anda.

public class EmployeesController: ApiController

{

    [NotImplementedExceptionFilter]

    Public Employee GetEmployee (int id)

    {

        melempar NotImplementedException () baru;

    }

}

Untuk menerapkan filter pengecualian di tingkat pengontrol, Anda perlu menggunakan atribut filter di tingkat kelas seperti yang ditunjukkan di bawah ini.

[DatabaseExceptionFilter]

public class EmployeesController: ApiController

{

    // Beberapa kode

}

Anda juga dapat menerapkan filter pengecualian khusus Anda secara global sehingga berfungsi untuk semua pengontrol API Web. Inilah cara Anda melakukan ini.

GlobalConfiguration.Configuration.Filters.Add (baru DatabaseExceptionFilterAttribute ());

Cuplikan kode berikut mengilustrasikan bagaimana Anda dapat menerapkan filter pengecualian khusus yang kami buat sebelumnya ke metode pengontrol Anda.

[CustomExceptionFilter]

 publik IEnumerable Get ()

 {

    melempar DivideByZeroException () baru; 

 }

ASP.NET Web API mendukung penggunaan HttpResponseException untuk menangani pengecualian baik di tingkat pengontrol maupun di tingkat tindakan. Saat metode tindakan di Web API menampilkan pengecualian yang tidak tertangkap, pengecualian tersebut diterjemahkan ke Kode Status HTTP 500, yaitu "Kesalahan Server Internal". Jika Anda menggunakan HttpResponseException, Anda dapat menentukan kode status yang ingin Anda kembalikan dalam konstruktor kelas HttpResponseException. Dengan cara ini Anda dapat menyesuaikan kode kesalahan Anda agar lebih bermakna.

Cara melakukan lebih banyak di ASP.NET dan ASP.NET Core:

  • Cara menggunakan cache dalam memori di ASP.NET Core
  • Bagaimana menangani kesalahan di ASP.NET Web API
  • Cara meneruskan beberapa parameter ke metode pengontrol API Web
  • Cara log permintaan dan respons metadata di ASP.NET Web API
  • Cara bekerja dengan HttpModules di ASP.NET
  • Versi lanjutan dalam ASP.NET Core Web API
  • Cara menggunakan injeksi ketergantungan di ASP.NET Core
  • Cara bekerja dengan sesi di ASP.NET
  • Bagaimana bekerja dengan HTTPHandlers di ASP.NET
  • Cara menggunakan IHostedService di ASP.NET Core
  • Cara menggunakan layanan sabun WCF di ASP.NET Core
  • Cara meningkatkan kinerja aplikasi ASP.NET Core
  • Cara menggunakan ASP.NET Core Web API menggunakan RestSharp
  • Cara bekerja dengan masuk ke ASP.NET Core
  • Cara menggunakan MediatR di ASP.NET Core
  • Cara bekerja dengan status sesi di ASP.NET Core
  • Cara menggunakan Nancy di ASP.NET Core
  • Pahami pengikatan parameter di ASP.NET Web API
  • Cara mengupload file di ASP.NET Core MVC
  • Bagaimana menerapkan penanganan pengecualian global di ASP.NET Core Web API
  • Cara menerapkan pemeriksaan kesehatan di ASP.NET Core
  • Praktik terbaik dalam caching di ASP.NET
  • Cara menggunakan perpesanan Apache Kafka di .NET
  • Cara mengaktifkan CORS di API Web Anda
  • Kapan menggunakan WebClient vs. HttpClient vs. HttpWebRequest
  • Cara bekerja dengan Redis Cache di .NET
  • Kapan menggunakan Task.WaitAll vs. Task.WhenAll di .NET