Latar Belakang
Saya mengembangkan Lapisan Layanan API untuk klien dan saya telah diminta untuk menangkap dan mencatat semua kesalahan secara global.
Jadi, sementara sesuatu seperti titik akhir yang tidak diketahui (atau tindakan) mudah ditangani dengan menggunakan ELMAH atau dengan menambahkan sesuatu seperti ini ke Global.asax
:
protected void Application_Error()
{
Exception unhandledException = Server.GetLastError();
//do more stuff
}
. . Kesalahan .unhandled yang tidak terkait dengan perutean tidak bisa login. Sebagai contoh:
public class ReportController : ApiController
{
public int test()
{
var foo = Convert.ToInt32("a");//Will throw error but isn't logged!!
return foo;
}
}
Saya juga telah mencoba mengatur [HandleError]
atribut secara global dengan mendaftarkan filter ini:
filters.Add(new HandleErrorAttribute());
Tapi itu juga tidak mencatat semua kesalahan.
Masalah / pertanyaan
Bagaimana cara mencegat kesalahan seperti yang dihasilkan oleh panggilan di /test
atas sehingga saya bisa mencatatnya? Tampaknya jawaban ini harus jelas, tetapi saya telah mencoba semua yang dapat saya pikirkan sejauh ini.
Idealnya, saya ingin menambahkan beberapa hal ke log kesalahan, seperti alamat IP pengguna yang meminta, tanggal, waktu, dan sebagainya. Saya juga ingin dapat mengirim email kepada staf pendukung secara otomatis ketika kesalahan terjadi. Semua ini bisa saya lakukan seandainya saya bisa mencegat kesalahan ini ketika itu terjadi!
TERSELESAIKAN!
Terima kasih kepada Darin Dimitrov, yang jawabannya saya terima, saya mengerti hal ini. WebAPI tidak menangani kesalahan dengan cara yang sama seperti pengontrol MVC biasa.
Inilah yang berhasil:
1) Tambahkan filter khusus ke namespace Anda:
public class ExceptionHandlingAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
if (context.Exception is BusinessException)
{
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)
{
Content = new StringContent(context.Exception.Message),
ReasonPhrase = "Exception"
});
}
//Log Critical errors
Debug.WriteLine(context.Exception);
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)
{
Content = new StringContent("An error occurred, please try again or contact the administrator."),
ReasonPhrase = "Critical Exception"
});
}
}
2) Sekarang daftarkan filter secara global di kelas WebApiConfig :
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{action}/{id}", new { id = RouteParameter.Optional });
config.Filters.Add(new ExceptionHandlingAttribute());
}
}
ATAU Anda dapat melewati pendaftaran dan hanya menghiasi satu pengontrol dengan [ExceptionHandling]
atribut.