Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Artikel ini menjelaskan penanganan kesalahan dan pengecualian di ASP.NET Web API.
HttpResponseException
Apa yang terjadi jika pengontrol API Web melemparkan pengecualian yang tidak terjaring? Secara default, sebagian besar pengecualian diterjemahkan ke dalam respons HTTP dengan kode status 500, Kesalahan Server Internal.
Jenis HttpResponseException adalah kasus khusus. Pengecualian ini mengembalikan kode status HTTP apa pun yang Anda tentukan dalam konstruktor pengecualian. Misalnya, metode berikut mengembalikan 404, Tidak Ditemukan, jika parameter id tidak valid.
public Product GetProduct(int id)
{
Product item = repository.Get(id);
if (item == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
return item;
}
Untuk kontrol lebih lanjut atas respons, Anda juga dapat membuat seluruh pesan respons dan menyertakannya dengan HttpResponseException:
public Product GetProduct(int id)
{
Product item = repository.Get(id);
if (item == null)
{
var resp = new HttpResponseMessage(HttpStatusCode.NotFound)
{
Content = new StringContent(string.Format("No product with ID = {0}", id)),
ReasonPhrase = "Product ID Not Found"
};
throw new HttpResponseException(resp);
}
return item;
}
Filter Pengecualian
Anda dapat menyesuaikan cara Web API menangani pengecualian dengan menulis filter pengecualian. Filter pengecualian dijalankan ketika metode pengontrol melemparkan pengecualian yang tidak tertangani yang bukan pengecualian HttpResponseException . Jenis HttpResponseException adalah kasus khusus, karena dirancang khusus untuk mengembalikan respons HTTP.
Filter pengecualian mengimplementasikan antarmuka System.Web.Http.Filters.IExceptionFilter . Cara paling sederhana untuk menulis filter pengecualian adalah dengan memperoleh dari kelas System.Web.Http.Filters.ExceptionFilterAttribute dan mengambil alih metode OnException .
Catatan
Filter pengecualian di ASP.NET Web API mirip dengan yang ada di ASP.NET MVC. Namun, mereka dinyatakan dalam namespace layanan dan fungsi terpisah secara terpisah. Secara khusus, kelas HandleErrorAttribute yang digunakan dalam MVC tidak menangani pengecualian yang dilemparkan oleh pengontrol Web API.
Berikut adalah filter yang mengonversi pengecualian NotImplementedException menjadi kode status HTTP 501, Tidak Diimplementasikan:
namespace ProductStore.Filters
{
using System;
using System.Net;
using System.Net.Http;
using System.Web.Http.Filters;
public class NotImplExceptionFilterAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
if (context.Exception is NotImplementedException)
{
context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);
}
}
}
}
Properti Respons objek HttpActionExecutedContext berisi pesan respons HTTP yang akan dikirim ke klien.
Mendaftarkan Filter Pengecualian
Ada beberapa cara untuk mendaftarkan filter pengecualian API Web:
- Menurut tindakan
- Menurut pengontrol
- Secara global
Untuk menerapkan filter ke tindakan tertentu, tambahkan filter sebagai atribut ke tindakan:
public class ProductsController : ApiController
{
[NotImplExceptionFilter]
public Contact GetContact(int id)
{
throw new NotImplementedException("This method is not implemented");
}
}
Untuk menerapkan filter ke semua tindakan pada pengontrol, tambahkan filter sebagai atribut ke kelas pengontrol:
[NotImplExceptionFilter]
public class ProductsController : ApiController
{
// ...
}
Untuk menerapkan filter secara global ke semua pengontrol API Web, tambahkan instans filter ke koleksi GlobalConfiguration.Configuration.Filters . Filter pengecualian dalam koleksi ini berlaku untuk setiap tindakan pengontrol API Web.
GlobalConfiguration.Configuration.Filters.Add(
new ProductStore.NotImplExceptionFilterAttribute());
Jika Anda menggunakan templat proyek "ASP.NET MVC 4 Web Application" untuk membuat proyek Anda, letakkan kode konfigurasi Web API Anda di dalam WebApiConfig kelas , yang terletak di folder App_Start:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Filters.Add(new ProductStore.NotImplExceptionFilterAttribute());
// Other configuration code...
}
}
HttpError
Objek HttpError menyediakan cara yang konsisten untuk mengembalikan informasi kesalahan dalam isi respons. Contoh berikut menunjukkan cara mengembalikan kode status HTTP 404 (Tidak Ditemukan) dengan HttpError di isi respons.
public HttpResponseMessage GetProduct(int id)
{
Product item = repository.Get(id);
if (item == null)
{
var message = string.Format("Product with id = {0} not found", id);
return Request.CreateErrorResponse(HttpStatusCode.NotFound, message);
}
else
{
return Request.CreateResponse(HttpStatusCode.OK, item);
}
}
CreateErrorResponse adalah metode ekstensi yang ditentukan dalam kelas System.Net.Http.HttpRequestMessageExtensions . Secara internal, CreateErrorResponse membuat instans HttpError lalu membuat HttpResponseMessage yang berisi HttpError.
Dalam contoh ini, jika metode berhasil, ia mengembalikan produk dalam respons HTTP. Tetapi jika produk yang diminta tidak ditemukan, respons HTTP berisi HttpError di isi permintaan. Responsnya mungkin terlihat seperti berikut ini:
HTTP/1.1 404 Not Found
Content-Type: application/json; charset=utf-8
Date: Thu, 09 Aug 2012 23:27:18 GMT
Content-Length: 51
{
"Message": "Product with id = 12 not found"
}
Perhatikan bahwa HttpError diserialisasikan ke JSON dalam contoh ini. Salah satu keuntungan menggunakan HttpError adalah melalui proses negosiasi konten dan serialisasi yang sama dengan model lain yang dititik kuat.
HttpError dan Validasi Model
Untuk validasi model, Anda dapat meneruskan status model ke CreateErrorResponse, untuk menyertakan kesalahan validasi dalam respons:
public HttpResponseMessage PostProduct(Product item)
{
if (!ModelState.IsValid)
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
// Implementation not shown...
}
Contoh ini mungkin mengembalikan respons berikut:
HTTP/1.1 400 Bad Request
Content-Type: application/json; charset=utf-8
Content-Length: 320
{
"Message": "The request is invalid.",
"ModelState": {
"item": [
"Required property 'Name' not found in JSON. Path '', line 1, position 14."
],
"item.Name": [
"The Name field is required."
],
"item.Price": [
"The field Price must be between 0 and 999."
]
}
}
Untuk informasi selengkapnya tentang validasi model, lihat Validasi Model di ASP.NET Web API.
Menggunakan HttpError dengan HttpResponseException
Contoh sebelumnya mengembalikan pesan HttpResponseMessage dari tindakan pengontrol, tetapi Anda juga dapat menggunakan HttpResponseException untuk mengembalikan HttpError. Ini memungkinkan Anda mengembalikan model yang sangat ditik dalam kasus keberhasilan normal, sambil tetap mengembalikan HttpError jika ada kesalahan:
public Product GetProduct(int id)
{
Product item = repository.Get(id);
if (item == null)
{
var message = string.Format("Product with id = {0} not found", id);
throw new HttpResponseException(
Request.CreateErrorResponse(HttpStatusCode.NotFound, message));
}
else
{
return item;
}
}