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

执行顺序:
二、结果过滤器实现
结果过滤器定义:
异结果过滤器实现了 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调用接口时经过结果过滤器处理返回数据:
