배경
클라이언트를위한 API 서비스 계층을 개발 중이며 전 세계적으로 모든 오류를 포착하고 기록하도록 요청되었습니다.
따라서 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 주소, 날짜, 시간 등과 같은 오류 로깅에 몇 가지 사항을 추가하고 싶습니다. 또한 오류가 발생하면 지원 담당자에게 자동으로 전자 메일을 보내려고합니다. 이 오류가 발생할 때만 이러한 오류를 가로 챌 수있는 경우이 모든 작업을 수행 할 수 있습니다.
해결되었습니다!
대답을 수락 한 Darin Dimitrov 덕분에 나는 이것을 알아 냈습니다. 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]
속성 으로 단일 컨트롤러를 장식 할 수 있습니다 .