我正在为一个客户端开发一个 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 地址、日期、时间等等。我还希望能够在遇到错误时自动向支持人员发送电子邮件。所有这些我都可以做,只要我可以拦截这些错误时,他们发生了!
多亏了达林 · 迪米特洛夫,我接受了他的回答,我想通了这个问题
以下是起作用的方法:
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());
}
}
OR 可以跳过注册,只用 [ExceptionHandling]
属性装饰一个控制器。