asp.Netcore webapi統一処理戻り値、異常、要求パラメータ検証

3147 ワード

現在の開発モデルではaspはあまり使われていない.Netmvcプロジェクトはインタフェースとデータベースを直接操作します.ほとんどは前後端分離を用い,より多くはAPIがモバイル端をサポートするためである.
バックエンドがwebapiを書くときは、必ずフロントエンドと要求値と戻り値のフォーマットを約束する必要があります.異常な戻りがあれば、どのように識別し、区別すればいいですか.
AOP切り込み処理はactionfilterにより実現でき,各メソッドで処理する必要はない.
  /// 
    /// Api action       
    ///         {code:200,body:{}}
    /// 
    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);
        }

        /// 
        ///            ,    json    
        ///       ExceptionFilterAttribute     
        /// 
        /// 
        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);
        }
    }

    /// 
    /// api         
    ///        500       501
    /// 
    public class ApiExceptionFilterAttribute : ExceptionFilterAttribute
    {
        public override void OnException(ExceptionContext context)
        {
            context.Result = BuildExceptionResult(context.Exception);
            base.OnException(context);
        }

        /// 
        ///         
        /// 
        /// 
        /// 
        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 });
        }
    }