Cara menangani ralat dalam API Web ASP.NET

API Web ASP.NET Microsoft adalah rangka kerja ringan yang boleh anda gunakan untuk membina perkhidmatan RESTful tanpa status yang berjalan di HTTP. Pengecualian adalah kesalahan yang berlaku pada waktu runtime, dan pengendalian pengecualian adalah teknik menangani kesalahan runtime dalam kod aplikasi anda.

Setiap pembangun API Web ASP.NET harus tahu bagaimana menangani pengecualian dalam API Web dan cara menghantar kod ralat dan mesej ralat yang sesuai dari kaedah pengawal API Web. Kami akan memeriksa bagaimana melaksanakan tugas-tugas ini di bahagian di bawah. 

Menggunakan HttpResponseException dalam ASP.NET Web API

Anda boleh menggunakan kelas HttpResponseException untuk mengembalikan kod status HTTP dan mesej tertentu dari kaedah pengawal anda di API Web. Inilah contohnya.

Public Employee GetEm Employee (int id)

{

    Pekerja emp = pegawaiRepository.Dapatkan (id);

    jika (emp == null)

    {

        tindak balas var = HttpResponseMessage baru (HttpStatusCode.NotFound)

        {

            Kandungan = StringContent baru ("Pekerja tidak ada", System.Text.Encoding.UTF8, "text / plain"),

            StatusCode = HttpStatusCode.NotFound

        }

        membuang HttpResponseException (tindak balas) baru;

    }

    kembali emp;

}

Sekiranya API Web anda mengembalikan IHttpActionResult, anda mungkin ingin menulis kaedah GetEm Employee seperti yang ditunjukkan di bawah.

awam IHttpActionResult GetEm Employee (int id)

{

    Pekerja emp = pegawaiRepository.Dapatkan (id);

    jika (emp == null)

    {

        tindak balas var = HttpResponseMessage baru (HttpStatusCode.NotFound)

        {

            Kandungan = StringContent baru ("Pekerja tidak ada", System.Text.Encoding.UTF8, "text / plain"),

            StatusCode = HttpStatusCode.NotFound

        }

        membuang HttpResponseException (tindak balas) baru;

    }

    kembali Ok (emp);

}

Perhatikan bahawa kod ralat dan pesan kesalahan ditugaskan ke objek respons, dan bahawa contoh HttpResponseException dikembalikan apabila pengecualian berlaku dalam kaedah tindakan pengawal API Web.

Menggunakan HttpError di ASP.NET Web API

Anda boleh menggunakan kaedah lanjutan CreateErrorResponse dalam kaedah pengawal API Web anda untuk mengembalikan kod ralat dan mesej ralat yang bermakna. Perhatikan bahawa kaedah CreateErrorResponse membuat objek HttpError dan kemudian membungkusnya di dalam objek HttpResponseMessage.

Penyenaraian kod berikut menggambarkan bagaimana anda boleh menggunakan kaedah peluasan CreateErrorResponse dari kaedah tindakan pengawal API Web anda.

awam IActionResult GetEm Employee (int id)

{

    Pekerja emp = pegawaiRepository.Dapatkan (id);

    jika (emp == null)

    {

       string message = "Pekerja tidak wujud";

        membuang HttpResponseException baru (

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

    }

    kembali Ok (emp);

}

Rujuk kaedah GetEm Employee () seperti di atas. Kaedah ini menerima ID pekerja sebagai parameter dan menggunakan ID ini untuk mencari dan mengambil rekod pekerja menggunakan contoh repositori pekerja. Sekiranya rekod pekerja yang mempunyai ID pekerja yang ditentukan tidak dijumpai, contoh HttpResponseException akan dilemparkan. Perhatikan bagaimana mesej ralat dan kod ralat yang sesuai dibina sebelum contoh pengecualian dibuang dari kaedah pengawal API Web.

Menggunakan penapis pengecualian dalam ASP.NET Web API

Penapis pengecualian adalah penapis yang dapat digunakan untuk menangani pengecualian yang tidak ditangani yang dihasilkan dalam kaedah pengawal API Web anda. Dengan kata lain, anda boleh menggunakan penapis pengecualian untuk menangkap pengecualian yang tidak ditangani dalam API Web yang berasal dari kaedah pengawal anda. Perhatikan bahawa penapis ralat global adalah pendekatan yang baik untuk menangani pengecualian dalam API Web anda jika pengecualian yang tidak ditangani dilemparkan dan tidak ditangani dalam kaedah pengawal anda.

Untuk membuat penapis pengecualian, anda perlu melaksanakan antara muka IExceptionFilter. Anda juga boleh membuat penapis pengecualian dengan memperluas kelas abstrak ExceptionFilterAttribute dan kemudian mengesampingkan kaedah OnException. Perhatikan bahawa kelas abstrak ExceptionFilterAttribute seterusnya menerapkan antara muka IExceptionFilter.

Coretan kod berikut menggambarkan bagaimana anda boleh membuat penapis pengecualian tersuai dengan memperluas kelas ExceptionFilterAttribute dan kemudian mengesampingkan kaedah OnException. Perhatikan bagaimana pengecualian standard yang dilemparkan oleh kaedah pengawal anda ditangkap oleh penapis pengecualian khas dan kemudian ditukar menjadi objek HttpStatusResponse dengan HttpStatusCode yang sesuai.

kelas awam CustomExceptionFilter: ExceptionFilterAttribute

    {

        penolakan awam membatalkan OnException (HttpActionExecutedContext actionExecutedContext)

        {

            Status HttpStatusCode = HttpStatusCode.InternalServerError;

            Mesej rentetan = Rentetan. Kosong;

            var exceptionType = actionExecutedContext.Exception.GetType ();

            jika (exceptionType == typeof (UnauthorizedAccessException))

            {

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

                status = HttpStatusCode. Tidak dibenarkan;

            }

            lain jika (pengecualianType == typeof (DivideByZeroException))

            {

                message = "Ralat Pelayan Dalaman.";

                status = HttpStatusCode.InternalServerError;

            }

            yang lain

            {

                message = "Tidak dijumpai.";

                status = HttpStatusCode.NotFound;

            }

            actionExecutedContext.Response = HttpResponseMessage baru ()

            {

                Kandungan = StringContent baru (mesej, System.Text.Encoding.UTF8, "text / plain"),

                StatusCode = status

            };

            base.OnException (actionExecutedContext);

        }

    }

Anda harus menambahkan penapis pengecualian khusus ke koleksi penapis objek HttpConfiguration.

Daftar tidak sah awam (konfigurasi HttpConfiguration)

        {

            config.MapHttpAttributeRoutes ();

            config.Routes.MapHttpRoute (

                nama: "DefaultApi",

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

                lalai: baru {id = RouteParameter.Optional}

            );

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

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

        }

Anda boleh mendaftarkan penapis pengecualian anda dengan salah satu daripada tiga cara berikut:

  • Pada peringkat tindakan
  • Di peringkat pengawal
  • Di peringkat global

Coretan kod berikut menunjukkan bagaimana anda dapat menerapkan penapis pada tahap tindakan, iaitu pada kaedah tindakan pengawal anda.

kelas awam EmployeesController: ApiController

{

    [NotImplementedExceptionFilter]

    Public Employee GetEm Employee (int id)

    {

        membuang NotImplementedException baru ();

    }

}

Untuk menggunakan pengecualian penapis pada tahap pengawal, anda perlu menggunakan atribut penapis pada peringkat kelas seperti yang ditunjukkan di bawah.

[Pangkalan DataExceptionFilter]

kelas awam EmployeesController: ApiController

{

    // Beberapa kod

}

Anda juga dapat menerapkan penapis pengecualian khusus anda ke seluruh dunia sehingga berfungsi untuk semua pengawal API Web. Inilah cara anda boleh melakukan ini.

GlobalConfiguration.Configuration.Filters.Add (pangkalan data baruExceptionFilterAttribute ());

Coretan kod berikut menggambarkan bagaimana anda boleh menggunakan penapis pengecualian khusus yang kami buat sebelumnya ke kaedah pengawal anda.

[CustomExceptionFilter]

 awam IEnumerable Get ()

 {

    lemparkan DivideByZeroException baru (); 

 }

ASP.NET Web API menyokong penggunaan HttpResponseException untuk menangani pengecualian baik di peringkat pengawal dan di tahap tindakan. Apabila kaedah tindakan dalam Web API melontarkan pengecualian yang tidak dapat dipahami, pengecualian diterjemahkan ke HTTP Status Code 500, iaitu, "Ralat Pelayan Dalaman." Sekiranya anda menggunakan HttpResponseException, anda boleh menentukan kod status yang anda ingin kembalikan dalam konstruktor kelas HttpResponseException. Dengan cara ini anda dapat menyesuaikan kod ralat anda agar lebih bermakna.

Cara melakukan lebih banyak perkara dalam ASP.NET dan ASP.NET Core:

  • Cara menggunakan cache dalam memori di ASP.NET Core
  • Cara menangani ralat dalam API Web ASP.NET
  • Cara menyampaikan beberapa parameter ke kaedah pengawal API Web
  • Cara log metadata permintaan dan respons di API Web ASP.NET
  • Cara bekerja dengan HttpModules di ASP.NET
  • Versi lanjutan dalam ASP.NET Core Web API
  • Cara menggunakan suntikan kebergantungan dalam ASP.NET Core
  • Cara bekerja dengan sesi di ASP.NET
  • Cara bekerja dengan HTTPHandlers di ASP.NET
  • Cara menggunakan IHostedService dalam ASP.NET Core
  • Cara menggunakan perkhidmatan WCF SOAP di ASP.NET Core
  • Cara meningkatkan prestasi aplikasi ASP.NET Core
  • Cara menggunakan API Web Teras ASP.NET menggunakan RestSharp
  • Cara bekerja dengan log masuk di ASP.NET Core
  • Cara menggunakan MediatR dalam ASP.NET Core
  • Cara bekerja dengan keadaan sesi di ASP.NET Core
  • Cara menggunakan Nancy di ASP.NET Core
  • Fahami pengikatan parameter dalam ASP.NET Web API
  • Cara memuat naik fail dalam ASP.NET Core MVC
  • Cara melaksanakan pengendalian pengecualian global dalam ASP.NET Core Web API
  • Cara melaksanakan pemeriksaan kesihatan di ASP.NET Core
  • Amalan terbaik dalam membuat cache di ASP.NET
  • Cara menggunakan pesanan Apache Kafka di .NET
  • Cara mengaktifkan CORS pada API Web anda
  • Bila hendak menggunakan WebClient vs. HttpClient vs. HttpWebRequest
  • Cara bekerjasama dengan Redis Cache di .NET
  • Bila hendak menggunakan Task.WaitAll vs. Task.WhenAll in .NET