背景
我正在为客户端开发API服务层,并且已要求我全局捕获和记录所有错误。
因此,虽然可以通过使用ELMAH或将类似的内容添加到来轻松处理未知端点(或动作)之类的内容Global.asax
:
protected void Application_Error()
{
Exception unhandledException = Server.GetLastError();
//do more stuff
}
。。与路由无关的.unhanded错误不会记录。例如:
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]
属性装饰单个控制器。