在 ASP.NET MVC 中可以在 Application_Error 中写日志,在 ASP.NET Web API 中该如何处理呢?
自定义IExceptionLogger
基于IExceptionLogger的解决方法。
定义一个自己的ExceptionLogger,比如BlogExceptionLogger,继承自ExceptionLogger,重载LogAsync()方法:
public class BlogExceptionLogger : ExceptionLogger { public override Task LogAsync(ExceptionLoggerContext context, CancellationToken cancellationToken) { Logger.Default.Error("Web API Exception", context.Exception); return base.LogAsync(context, cancellationToken); } }
然后在Global.asax.cs的Application_Start()方法中应用这个BlogExceptionLogger:
var config = GlobalConfiguration.Configuration; config.Services.Add(typeof(IExceptionLogger), new BlogExceptionLogger());
全局异常过滤器可以抓到webapi里面的异常.管道外面的就只能用管理事件了.webapi应该也是可以注册Application_Error事件的.用owin的话应该也有对应的异常处理事件
基于ExceptionFilterAttribute的解决方法。
定义一个自己的ExceptionFilter继承自ExceptionFilterAttribute,并重载OnExceptionAsync()方法,在其中写日志,代码如下:
public class BlogExceptionFilter : ExceptionFilterAttribute { public override Task OnExceptionAsync( HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken) { Logger.Default.Error("Web API Exception", actionExecutedContext.Exception); return base.OnExceptionAsync(actionExecutedContext, cancellationToken); } }
然后在Global.asax.cs的Application_Start()方法中添加这个ExceptionFilter:
var config = GlobalConfiguration.Configuration; config.Filters.Add(new BlogExceptionFilter());