结果过滤器—MVC项目中结果过滤器(Result Filter)使用

一、什么是结果过滤器?

     结果过滤器(ResultFilter),是对执行的Action结果进行处理的一种AOP思想,适用于任何需要直接环绕 View 或格式化处理的逻辑。结果过滤器可以替换或更改 Action 结果。在 IActionResult 执行的前后执行,使用它能够控制Action的执行结果,比如:格式化结果等。需要注意的是,它只有在Action方法成功执行完成后才会运行。 一般项目中很少使用。.

结果过滤器—MVC项目中结果过滤器(Result Filter)使用

执行顺序:

1、执行控制器中的构造函数,实例化控制器
2、执行具体的Action方法
3、执行ResultFilter.OnResultExecuting方法
4、渲染视图或处理结果
5、执行ResultFilter.OnResultExecuted方法

二、结果过滤器实现

结果过滤器定义:

    异结果过滤器实现了 IAsyncResultFilter 或 IResultFilter 接口,当实现IAsyncResultFilter重写OnResultExecutionAsync方法,实现IResultFilter,重写OnResultExecuting和OnResultExecuted方法。

    /// <summary>    /// 结果过滤器    /// </summary>    public class MyResultFilter : Attribute, IResultFilter    {
        #region IResultFilter
        /// <summary>        ///执行之前        /// </summary>        /// <param name="context"></param>        public void OnResultExecuting(ResultExecutingContext context)        {            if (context.Result is JsonResult)            {                JsonResult result = (JsonResult)context.Result;
                //进行返回结果进行再次封装                context.Result = new JsonResult(new                {                    Success = true,                    Message = "Ok",                    Data = result.Value                });            }        }        /// <summary>        ///执行之后        /// </summary>        /// <param name="context"></param>        public void OnResultExecuted(ResultExecutedContext context)        {            var  result = context.Result;//拿到Json结果
            Console.WriteLine("在执行之后ResultFilter.OnResultExecuted方法");        }        #endregion
        #region IAsyncResultFilter
        /// <summary>        /// 执行时        /// </summary>        /// <param name="context"></param>        /// <param name="next"></param>        /// <returns></returns>        /// <exception cref="NotImplementedException"></exception>        public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)        {            if (context.Result is JsonResult)            {                JsonResult result = (JsonResult)context.Result;                context.Result = new JsonResult(new                {                    Success = true,                    Message = "Ok",                    Data = result.Value                });            }            await next.Invoke();        }        #endregion    }

操作级别作用范围过滤器:

在需要使用结果过滤器上的Action标注上特性标签

 [MyResultFilter]//作用范围是操作过滤器级别

添加测试Action:

  [Route("api/[controller]")]    [ApiController]    public class ResultFilterController : Controller    {
        /// <summary>        /// 测试:调用返回JSON        /// </summary>        /// <returns></returns>        [HttpGet]        [MyResultFilter]//作用范围是操作过滤器级别        public IActionResult Test()        {            return Json(new            {                Id = 008,                Name = "Aliang",                Age = 28            });
        }    }

三、验证:

接口访问调用:

访问地址:

https://localhost:5001/ResultFilter/Test

调用接口时经过结果过滤器处理返回数据:

结果过滤器—MVC项目中结果过滤器(Result Filter)使用