zoukankan      html  css  js  c++  java
  • asp.net core webapi 统一处理返回值、异常和请求参数验证

    现在的开发模式很少用asp.net mvc一个项目直接操作界面和数据库了。大部分都使用前后端分离,更多的是为了让API支持移动端。

    后端写webapi的时候必然需要和前端约定请求值和返回值的格式,如果有异常返回应该如何识别和区分;

    通过actionfilter即可实现AOP切入处理,而不需要在每个方法中处理。

      /// <summary>
        /// Api action统一处理过滤器
        /// 处理正常返回值 {code:200,body:{}}
        /// </summary>
        public class ApiResponseFilterAttribute : ActionFilterAttribute
        {
            public override void OnActionExecuting(ActionExecutingContext context)
            {
                //模型验证
                if (!context.ModelState.IsValid)
                {
                    throw new ApplicationException(context.ModelState.Values.First(p => p.Errors.Count > 0).Errors[0].ErrorMessage);
                }
                base.OnActionExecuting(context);
            }
    
            /// <summary>
            /// 处理正常返回的结果对象,进行统一json格式包装
            /// 异常只能交由ExceptionFilterAttribute 去处理 
            /// </summary>
            /// <param name="context"></param>
            public override void OnActionExecuted(ActionExecutedContext context)
            {
                if (context.Result != null)
                {
                    var result = context.Result as ObjectResult;
                    JsonResult newresult;
                    if (context.Result is ObjectResult)
                    {
                        newresult = new JsonResult(new { code = 200, body = result.Value });
                    }
                    else if (context.Result is EmptyResult)
                    {
                        newresult = new JsonResult(new { code = 200, body = new { } });
                    }
                    else
                    {
                        throw new Exception($"未经处理的Result类型:{ context.Result.GetType().Name}");
                    }
                    context.Result = newresult;
                }
                base.OnActionExecuted(context);
            }
        }
    
        /// <summary>
        /// api异常统一处理过滤器
        /// 系统级别异常 500 应用级别异常501
        /// </summary>
        public class ApiExceptionFilterAttribute : ExceptionFilterAttribute
        {
            public override void OnException(ExceptionContext context)
            {
                context.Result = BuildExceptionResult(context.Exception);
                base.OnException(context);
            }
    
            /// <summary>
            /// 包装处理异常格式
            /// </summary>
            /// <param name="ex"></param>
            /// <returns></returns>
            private JsonResult BuildExceptionResult(Exception ex)
            {
                int code = 0;
                string message = "";
                string innerMessage = "";
                //应用程序业务级异常
                if (ex is ApplicationException)
                {
                    code = 501;
                    message = ex.Message;
                }
                else
                {
                    // exception 系统级别异常,不直接明文显示的
                    code = 500;
                    message = "发生系统级别异常";
                    innerMessage = ex.Message;
                }
    
                if (ex.InnerException != null && ex.Message != ex.InnerException.Message)
                    innerMessage += "," + ex.InnerException.Message;
    
                return new JsonResult(new { code, message, innerMessage });
            }
        }
    
  • 相关阅读:
    5.小程序-生命周期函数
    4.小程序-路由跳转
    3.小程序-事件绑定
    2.小程序-数据绑定
    1.小程序index页静态搭建
    小程序简介
    单链表(Go)
    输入一个字符串,里面有26个英文字母和(半角逗号半角空格半角句号)按照()里的内容进行分割,遇到大写字母把其变成小写,遇到小写的将其变成大写然后输出字符串
    排序算法
    单例模式
  • 原文地址:https://www.cnblogs.com/sands/p/11460145.html
Copyright © 2011-2022 走看看