WebApi自定义全局异常过滤器及返回数据格式化

    WebApi在这里就不多说了,一种轻量级的服务,应用非常广泛。我这这里主要记录下有关 WebApi的相关知识,以便日后使用。

    当WebApi应用程序出现异常时,我们都会使用到异常过滤器进行日志记录,并在Global全局文件中注册,过滤器是一种AOP设计思想,即面向切面编程,其跟主业务无关,可以减少项目中的代码量以及降低各模块之间的耦合度。首先是ExceptionFilterAttribute抽象类,重写其中的OnException方法去自定义自己的异常过滤器。直接上代码。

/// <summary>
    /// 自定义程序异常过滤器
    /// </summary>
    public class CustomExceptionFilterAttribute : ExceptionFilterAttribute
    {
        /// <summary>
        /// NLog日志记录
        /// </summary>
        private static Logger logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name);


        /// <summary>
        /// 异常处理
        /// </summary>
        /// <param name="context"></param>
        public override void OnException(HttpActionExecutedContext context)
        {

            var ex = context.Exception.InnerException == null ? context.Exception : context.Exception.InnerException;
            //记录日志错误信息
            logger.Error($"{context.ActionContext.ControllerContext.ControllerDescriptor.ControllerType.FullName}." +
                $"{context.ActionContext.ActionDescriptor.ActionName}{Environment.NewLine}" +
                $"Arguments: {JsonConvert.SerializeObject(context.ActionContext.ActionArguments)}{Environment.NewLine}" +
                $"Message:{ex.ToString()}{Environment.NewLine}");
            //返回客户端异常信息
            context.Response = context.Request.CreateResponse(HttpStatusCode.OK,new WebApiFitlerResult() {
                code = WebApiFitlerResult.CodeEnumType.程序异常,
                msg = ex.Message
            });
        }
    }
View Code

   其中WebApiFitlerResult类为博主自定的错误信息类,包含错误状态码和错误信息属性。 

   最后在Global文件中的Application_Start管道方法中的全局配置中注册。代码如下。(此代码包含返回数据格式化设置和跨域设置)

 protected void Application_Start()
        {
//移除xml返回格式 GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; json.SerializerSettings.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.IsoDateFormat; json.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; json.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local;
//返回空值设置 json.SerializerSettings.NullValueHandling
= Newtonsoft.Json.NullValueHandling.Ignore; json.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.None json.SerializerSettings.ContractResolver = new DefaultContractResolver(); //全局注册 GlobalConfiguration.Configure(x=> { //跨域 x.EnableCors(new EnableCorsAttribute("*", "*", "*")); //异常过滤器注册 x.Filters.Add(new CustomExceptionFilterAttribute());
//webapi路由注册 x.MapHttpAttributeRoutes(); }); }

 我这边WebApi项目中返回的数据只有json格式,所以就把xml返回格式删除了。

  

原文地址:https://www.cnblogs.com/xiongtaotao/p/11598059.html