/// <summary>
/// WebApi的异常过滤器
/// </summary>
public class ExFilterAttribute : ExceptionFilterAttribute
{
/// <summary>
///
/// </summary>
/// <param name="actionExecutedContext"></param>
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
if (actionExecutedContext.Exception != null)
{
var ex = actionExecutedContext.Exception;
//获取ex的第一级内部异常
Exception innerEx = ex.InnerException ?? ex;
//循环获取内部异常直到获取详细异常信息为止
while (innerEx.InnerException != null)
{
innerEx = innerEx.InnerException;
}
//NLogLogger nlog = new NLogLogger();
var err = LogUtility.GetExceptionDetails(innerEx);
var logger = new DbSfcLogger(new SysApplogSfcRepository(new SfcUnitOfWork(DependencyRegistrar.CreateSfcSugarClient())));
logger.Error(err, innerEx);
actionExecutedContext.Response = new HttpResponseMessage
{
Content = new ObjectContent(typeof(ApiResult),
new ApiResult
{
Data = null,
Status = ResultStatus.Error,
Message = err,
ModelStateErrList = null
},
new JsonMediaTypeFormatter())
};
}
}
}
/// <summary>
///
/// </summary>
public class FilterConfig
{
/// <summary>
/// 注册MVC过滤器
/// </summary>
/// <param name="filters"></param>
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
/// <summary>
/// 注册API过滤器
/// </summary>
/// <param name="filters"></param>
public static void RegisterHttpFilters(HttpFilterCollection filters)
{
filters.Add(new ExFilterAttribute());
}
}
/// <summary>
///
/// </summary>
public class WebApiApplication : System.Web.HttpApplication
{
/// <summary>
///
/// </summary>
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
//注册MVC过滤器
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
//注册API过滤器
FilterConfig.RegisterHttpFilters(GlobalConfiguration.Configuration.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
GlobalConfig.PhysicalWebRootPath = Server.MapPath("~/");
GlobalConfig.ApplicationCodeBase = Assembly.GetExecutingAssembly().CodeBase;
ContainerManager.Container = ContainerManager.InitContainer();
}
}
给定的筛选器实例必须实现以下一个或多个筛选器接口:IAuthorizationFilter、IActionFilter、IResultFilter、IExceptionFilter。 (microsoft.com)