Lý lịch
Tôi đang phát triển Lớp dịch vụ API cho khách hàng và tôi đã được yêu cầu bắt và ghi lại tất cả các lỗi trên toàn cầu.
Vì vậy, trong khi một cái gì đó như một điểm cuối (hoặc hành động) không xác định có thể được xử lý dễ dàng bằng cách sử dụng ELMAH hoặc bằng cách thêm một cái gì đó như thế này vào Global.asax
:
protected void Application_Error()
{
Exception unhandledException = Server.GetLastError();
//do more stuff
}
. . .unhandled lỗi không liên quan đến định tuyến không được ghi lại. Ví dụ:
public class ReportController : ApiController
{
public int test()
{
var foo = Convert.ToInt32("a");//Will throw error but isn't logged!!
return foo;
}
}
Tôi cũng đã thử thiết lập [HandleError]
thuộc tính trên toàn cầu bằng cách đăng ký bộ lọc này:
filters.Add(new HandleErrorAttribute());
Nhưng điều đó cũng không ghi lại tất cả các lỗi.
Vấn đề / câu hỏi
Làm cách nào để chặn các lỗi như lỗi được tạo bằng cách gọi /test
ở trên để tôi có thể ghi lại chúng? Có vẻ như câu trả lời này là hiển nhiên, nhưng tôi đã thử mọi cách tôi có thể nghĩ cho đến nay.
Lý tưởng nhất, tôi muốn thêm một số thứ vào việc ghi nhật ký lỗi, chẳng hạn như địa chỉ IP của người dùng yêu cầu, ngày, giờ, v.v. Tôi cũng muốn có thể tự động gửi e-mail cho nhân viên hỗ trợ khi gặp lỗi. Tất cả điều này tôi có thể làm nếu chỉ tôi có thể chặn những lỗi này khi chúng xảy ra!
GIẢI QUYẾT!
Nhờ Darin Dimitrov, người mà tôi đã chấp nhận câu trả lời, tôi đã hiểu ra điều này. WebAPI không xử lý lỗi theo cách tương tự như bộ điều khiển MVC thông thường.
Đây là những gì đã làm việc:
1) Thêm bộ lọc tùy chỉnh vào không gian tên của bạn:
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) Bây giờ hãy đăng ký bộ lọc trên toàn cầu trong lớp 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());
}
}
HOẶC bạn có thể bỏ qua đăng ký và chỉ trang trí một bộ điều khiển duy nhất với [ExceptionHandling]
thuộc tính.