พื้นหลัง
ฉันกำลังพัฒนา API Service Layer สำหรับลูกค้าและฉันถูกขอให้ตรวจจับและบันทึกข้อผิดพลาดทั้งหมดทั่วโลก
ดังนั้นในขณะที่บางสิ่งเช่นปลายทางที่ไม่รู้จัก (หรือการกระทำ) สามารถจัดการได้อย่างง่ายดายโดยใช้ ELMAH หรือโดยการเพิ่มสิ่งนี้ในGlobal.asax
:
protected void Application_Error()
{
Exception unhandledException = Server.GetLastError();
//do more stuff
}
. . ข้อผิดพลาดที่ไม่ได้จัดการซึ่งไม่เกี่ยวข้องกับการกำหนดเส้นทางจะไม่ถูกบันทึก ตัวอย่างเช่น:
public class ReportController : ApiController
{
public int test()
{
var foo = Convert.ToInt32("a");//Will throw error but isn't logged!!
return foo;
}
}
ฉันได้ลองตั้งค่า[HandleError]
คุณลักษณะทั่วโลกด้วยการลงทะเบียนตัวกรองนี้:
filters.Add(new HandleErrorAttribute());
แต่นั่นก็ไม่ได้บันทึกข้อผิดพลาดทั้งหมด
ปัญหา / คำถาม
ฉันจะดักจับข้อผิดพลาดเช่นที่สร้างขึ้นโดยการโทร/test
ด้านบนเพื่อให้สามารถบันทึกได้อย่างไร ดูเหมือนว่าคำตอบนี้ควรชัดเจน แต่ฉันได้ลองทุกอย่างที่ฉันสามารถคิดได้จนถึงตอนนี้
โดยอุดมคติแล้วฉันต้องการเพิ่มบางสิ่งลงในการบันทึกข้อผิดพลาดเช่นที่อยู่ IP ของผู้ใช้ที่ขอวันที่เวลาและอื่น ๆ ฉันยังต้องการให้เจ้าหน้าที่สนับสนุนทางอีเมลโดยอัตโนมัติเมื่อพบข้อผิดพลาด ทั้งหมดนี้ฉันสามารถทำได้ก็ต่อเมื่อฉันสามารถดักจับข้อผิดพลาดเหล่านี้ได้เมื่อมันเกิดขึ้น!
แก้ไข!
ขอบคุณดารินดิมิทรอฟที่ตอบรับฉันได้รับการคำนวณนี้ WebAPI ไม่จัดการข้อผิดพลาดในลักษณะเดียวกับตัวควบคุม MVC ปกติ
นี่คือสิ่งที่ทำงาน:
1) เพิ่มตัวกรองที่กำหนดเองในเนมสเปซของคุณ:
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) ตอนนี้ลงทะเบียนตัวกรองทั่วโลกในคลาส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());
}
}
หรือคุณสามารถข้ามการลงทะเบียนและเพียงตกแต่งคอนโทรลเลอร์ตัวเดียวด้วยแอ[ExceptionHandling]
ททริบิวต์