我正在为客户开发API服务层,并且我被要求在全局范围内捕获并记录所有错误.
因此,虽然通过使用ELMAH或通过向以下内容添加类似内容,可以轻松处理类似未知端点(或操作)的内容Global.asax:
protected void Application_Error()
{
Exception unhandledException = Server.GetLastError();
//do more stuff
}
Run Code Online (Sandbox Code Playgroud)
...不会记录与路由无关的未处理错误.例如:
public class ReportController : ApiController
{
public int test()
{
var foo = Convert.ToInt32("a");//Will throw error but isn't logged!!
return foo;
}
}
Run Code Online (Sandbox Code Playgroud)
我还尝试[HandleError]通过注册此过滤器来全局设置该属性:
filters.Add(new HandleErrorAttribute());
Run Code Online (Sandbox Code Playgroud)
但这也不会记录所有错误.
如何拦截错误,例如通过调用/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 …Run Code Online (Sandbox Code Playgroud)