- A+
所属分类:.NET技术
一、什么是结果过滤器?
结果过滤器(ResultFilter),是对执行的Action结果进行处理的一种AOP思想,适用于任何需要直接环绕 View 或格式化处理的逻辑。结果过滤器可以替换或更改 Action 结果。在 IActionResult 执行的前后执行,使用它能够控制Action的执行结果,比如:格式化结果等。需要注意的是,它只有在Action方法成功执行完成后才会运行。 一般项目中很少使用。
执行顺序:
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
调用接口时经过结果过滤器处理返回数据:
建群声明:本着技术在于分享,方便大家交流学习的初心,特此建立【编程内功修炼交流群】,热烈欢迎各位爱交流学习的程序员进群,也希望进群的大佬能不吝分享自己遇到的技术问题和学习心得