基于过滤器的全局统一返回处理(适用NET 6 版本)

基于过滤器的全局统一返回处理

  • 适用版本:NET 6
  • 适用项目:Web Api
  • 具体项目:ASP.NET Core 6

我的解决方案

全局统一返回处理 结构

  • 常规API
  • 统一返回信息类
  • IActionFilter 接口实现

常规API

此处Demo,仅使用最少语法演示:

	[ApiController]
    [Route("api/[controller]")]
    public class TreeHolesController : Controller
    {
    	public TreeHolesController()
        {
        	/*-------------Code--------------*/
        }

		[HttpGet]
		public ActionResult<string> Index()
        {
            return "Hello World";
        }
    }

默认没有过滤器时,这个接口返回的就是这个字符串,没有任何封装
当下面的过滤器完成后,这个接口就会被过滤器自动封装,不需要额外再写其他的代码。

统一信息返回类

	public enum ResultInfoCode
    {
        [Description("有效操作")]
        SUCCESS = 1024,
        [Description("操作异常")]
        ERROR,
        [Description("无效操作")]
        FAIL,
        [Description("操作警告")]
        WARRING
    }


	public class ResultInfo
    {
        public ResultInfoCode Code { get; set; }
        public string? Title { get; set; }
        public string? Message { get; set; }
        public string? Url { get; set; }
        public Object? Data { get; set; }

        public ResultInfo(ResultInfoCode code, string message, string url,Object data)
        {
            Title = "Tip";
            Code = code;
            Message = message;
            Url = url;
            Data = data;
        }

    }

这里可以有多种实现构造函数,本Demo仅展示最初始的构造。

全局返回过滤器

这里主要用到IActionFilter接口的OnActionExecuted方法;定义一个你自己的过滤器继承这个接口,实现它的两个方法。

		public void OnActionExecuting(ActionExecutingContext executingContext)
        {
            HttpRequest obj = executingContext.HttpContext.Request;
            Console.WriteLine($"接受请求:[{obj.Method}=>{obj.Path}]");
        }

        /// <summary>
        /// 在 API 请求之后执行
        /// </summary>
        /// <param name="executedContext">操作完成后的上下文</param>
        public void OnActionExecuted(ActionExecutedContext executedContext)
        {
            HttpRequest item = executedContext.HttpContext.Request;
            // 强转位ObjectResult ,这样可以获得接口返回的信息
            ObjectResult obj = (ObjectResult)executedContext.Result;

            if (executedContext.Canceled)
            {
                // 是否被其他 Filters 短路
            }
            else if (executedContext.Exception != null)
            {
                // 是否存在异常
            }
            else {
                // 此处做一个Demo ,需要后期实现动态绑值,该值类型和接口返回类型相同
                string info = obj.Value.ToString();
                
                ResultInfo ts = new (obj.Value!=null?
                ResultInfoCode.SUCCESS:ResultInfoCode.ERROR,"ts",item.Path,info);
                
                executedContext.Result = new ObjectResult(ts);
                Console.WriteLine($"处理结果:[{((ObjectResult)executedContext.Result).Value}=>{item.Path}]");
            }
        }

至此,一个简单的全局统一信息(格式)返回就完成了。
这种方式,后期可以通过反射和ActionResult的返回值等方式来进行多态实现。

切记在Program.cs中添加对过滤器的支持builder.Services.AddControllers(options =>options.Filters.Add<ApplicationFilters>());


常规解决方案(通过开发者自我约束去实现)

全局统一返回处理 结构

  • 返回信息类
  • 常规API(可继承一个多态实现的返回信息类)
  • 多态实现的返回信息类:[可选]

常规API

	[ApiController]
    [Route("api/[controller]")]
    public class TreeHolesController : Controller /*,多态实现的返回信息类*/
    {
    	public TreeHolesController()
        {
        	/*-------------Code--------------*/
        }

		[HttpGet]
		public ActionResult<string> Index()
        {
            return new TreeInfo(ResultInfoCode.SUCCESS,
            		"Demo-default","/api/treeholes","Hello World");
        }
    }

常规方案具有更大的灵活性,但需要开发者在开发过程中,不断的添加和修改。


参考链接

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值