.Net Core 返回攔截統一處理返回值


最近搭項目框架,為了便於接口返回值統一規范,做了一些配置,使得無論接口方法返回值是什么類型,都統一做了攔截,具體實現方式為:

首先需要幾個過濾類:異常處理返回類,正常調用統一返回類,忽略返回格式類,

對應類代碼如下:

異常處理返回類

using System;
using System.Linq;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;

namespace S2_Xxxx_XxxNetApi
{
    /// <summary>
    /// Api action統一處理過濾器  
    /// 處理正常返回值
    /// </summary>
    public class ApiResultFilterAttribute : Attribute, IActionFilter
    {
        /// <summary>
        /// 執行方法體之后
        /// 返回結果為JsonResult的請求進行Result包裝
        /// </summary>
        /// <param name="context"></param>
        public void OnActionExecuted(ActionExecutedContext context)
        {
            //特殊處理:對有ApiIgnoreAttribute標簽的,不進行返回結果包裝,原樣輸出
            var controllerActionDescriptor = context.ActionDescriptor as ControllerActionDescriptor;
            if (controllerActionDescriptor != null)
            {
                var isDefined = controllerActionDescriptor.EndpointMetadata.Any(a => a.GetType().Equals(typeof(ApiIgnoreAttribute)));
                if (isDefined)
                {
                    return;
                }

            }
            // 返回結果為JsonResult的請求進行Result包裝
            if (context.Result != null)
            {
                if (context.Result is ObjectResult)
                {
                    var result = context.Result as ObjectResult;
                    context.Result = new JsonResult(new { code = 200, msg = "success", data = result.Value });

                }
                else if (context.Result is EmptyResult)
                {
                    context.Result = new JsonResult(new { code = 200, msg = "success", data = new { } });
                }
                else if (context.Result is ContentResult)
                {
                    var result = context.Result as ContentResult;
                    context.Result = new JsonResult(new { code = result.StatusCode, msg = result.Content });
                }
                else
                {
                    throw new Exception($"未經處理的Result類型:{ context.Result.GetType().Name}");
                }

            }

        }

        /// <summary>
        /// 執行方法體之前
        /// </summary>
        /// <param name="context"></param>
        public void OnActionExecuting(ActionExecutingContext context)
        {
            //不做修改
        }

    }
}
View Code

正常調用統一返回類

using System;
using System.Linq;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;

namespace S2_Xxxx_XxxNetApi
{
    /// <summary>
    /// Api action統一處理過濾器  
    /// 處理正常返回值
    /// </summary>
    public class ApiResultFilterAttribute : Attribute, IActionFilter
    {
        /// <summary>
        /// 執行方法體之后
        /// 返回結果為JsonResult的請求進行Result包裝
        /// </summary>
        /// <param name="context"></param>
        public void OnActionExecuted(ActionExecutedContext context)
        {
            //特殊處理:對有ApiIgnoreAttribute標簽的,不進行返回結果包裝,原樣輸出
            var controllerActionDescriptor = context.ActionDescriptor as ControllerActionDescriptor;
            if (controllerActionDescriptor != null)
            {
                var isDefined = controllerActionDescriptor.EndpointMetadata.Any(a => a.GetType().Equals(typeof(ApiIgnoreAttribute)));
                if (isDefined)
                {
                    return;
                }

            }
            // 返回結果為JsonResult的請求進行Result包裝
            if (context.Result != null)
            {
                if (context.Result is ObjectResult)
                {
                    var result = context.Result as ObjectResult;
                    context.Result = new JsonResult(new { code = 200, msg = "success", data = result.Value });

                }
                else if (context.Result is EmptyResult)
                {
                    context.Result = new JsonResult(new { code = 200, msg = "success", data = new { } });
                }
                else if (context.Result is ContentResult)
                {
                    var result = context.Result as ContentResult;
                    context.Result = new JsonResult(new { code = result.StatusCode, msg = result.Content });
                }
                else
                {
                    throw new Exception($"未經處理的Result類型:{ context.Result.GetType().Name}");
                }

            }

        }

        /// <summary>
        /// 執行方法體之前
        /// </summary>
        /// <param name="context"></param>
        public void OnActionExecuting(ActionExecutingContext context)
        {
            //不做修改
        }

    }
}
View Code

忽略返回格式類(這個類根據實際需求調整不需要攔截返回的類型)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace S2_Xxxx_XxxNetApi
{
    /// <summary>
    /// 使用該標簽,對結果原樣輸出,不做包裝
    /// </summary>
    public class ApiIgnoreAttribute : Attribute
    {
    }
}
View Code

然后在程序啟動類注入相關方法

public void ConfigureServices(IServiceCollection services)
        {
           //注冊過濾器
            services.AddSingleton<ApiResultFilterAttribute>();
            services.AddSingleton<ApiExceptionFilterAttribute>();

            services.AddMvc(
                    config =>
                    {
                        config.EnableEndpointRouting = false;
                        config.Filters.AddService(typeof(ApiResultFilterAttribute));
                        config.Filters.AddService(typeof(ApiExceptionFilterAttribute));
                    })
           .SetCompatibilityVersion(CompatibilityVersion.Version_3_0)
            .AddNewtonsoftJson();

        } 
View Code

做對應測試就可返回對應的類型

 

 

  

 

 

 

 這種返回值就比較統一規范,提高了前后端的協作;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM