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

结果,过滤器,mvc,项目,result,filter,使用 · 浏览次数 : 110

小编点评

**结果过滤器**是一个用于控制Action执行结果的AOP (抽象编程原理)技术,适用于任何需要直接环绕 View 或格式化处理的逻辑。 **实现步骤:** 1. **定义结果过滤器:**创建一个继承于 `IResultFilter` 的类,并重写 `OnResultExecuting` 和 `OnResultExecuted` 方法。 2. **在Action方法中使用结果过滤器:**使用 `[MyResultFilter]` 特性标签在Action方法上标注结果过滤器。 3. **执行ResultFilter:**在 `OnResultExecuting` 方法中,根据结果类型进行处理。 4. **执行结果过滤器:**在 `OnResultExecuted` 方法中,打印执行结果。 5. **执行结果过滤器:**在`OnResultExecuting` 方法中,如果结果是JsonResult,则将它转换成新的 JsonResult 对象并设置结果。 **示例代码:** ```csharp public class MyResultFilter : IResultFilter { // 重写OnResultExecuting 和 OnResultExecuted 方法 } public class ResultFilterController : Controller { [HttpGet] [MyResultFilter] public IActionResult Test() { return Json(new { Id = 008, Name = "Aliang", Age = 28 }); } } ``` **验证:** 访问地址 `https://localhost:5001/ResultFilter/Test`,将获取一个包含 JSON 数据的响应,并使用 `JsonResult` 类解析其内容。

正文

一、什么是结果过滤器?

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

执行顺序:

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

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

image

与结果过滤器—MVC项目中结果过滤器(Result Filter)使用相似的内容:

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

## 一、什么是结果过滤器? 结果过滤器(**ResultFilter**),是对执行的Action结果进行处理的一种AOP思想,适用于任何需要直接环绕 View 或格式化处理的逻辑。结果过滤器可以**替换或更改 Action 结果**。在 IActionResult 执行的前后执行,使用它能够控制

【转帖】纳尼,mysqldump导出的数据居然少了40万?

0、导读 用mysqldump备份数据时,加上 -w 条件选项过滤部分数据,发现导出结果比实际少了40万,什么情况? 本文约1500字,阅读时间约5分钟。 1、问题 我的朋友小文前几天遇到一个怪事,他用mysqldump备份数据时,加上了 -w 选项过滤部分数据,发现导出的数据比实际上少了40万。

聊聊基于Alink库的推荐系统

概述 Alink提供了一系列与推荐相关的组件,从组件使用得角度来看,需要重点关注如下三个方面: 算法选择 推荐领域有很多算法,常用的有基于物品/用户的协同过滤、ALS、FM算法等。对于不同的数据场景,算法也会在计算方式上有很大的变化。 推荐方式 输入信息可以有多种选择,输入结果也有多种情况。 同时输

[转帖]JMETER结果分析

https://www.cnblogs.com/a00ium/p/10462892.html 我相信你同意:有很多方法可以收集和解释JMeter结果,你会感到迷茫。 嗯,看完这篇文章后,您将了解收集和分析结果的12种不同方法! 我们将探索每种可能的方式来获得富有洞察力的指标,包括图形,图表,表格,H

[转帖]配置Jmeter压测结果在Grafana展示

https://cloud.tencent.com/developer/article/1782473?areaSource=&traceId= 最近正在研究Jenkins的CICD,其中有个环节就是stress test 压力测试。 原打算使用 taurus 来做压测的,但是遇到了些问题,时间有限

[转帖]stress工具使用指南和结果分析

https://www.cnblogs.com/muahao/p/6346775.html stress介绍 #stress `stress' imposes certain types of compute stress on your system Usage: stress [OPTION [

SPECJVM2008的简单结果

SPECJVM2008的简单结果 摘要 前面两天学习了SPECJVM2008简单使用. 今天进行一下简单的数据采集. 需要说明一下SPECJVM2008貌似仅兼容JDK1.8 更新的LTS版本都不兼容,比如JDK11和JDK17 背景 我这边先测试使用 startup 的测试脚本 startup 主

[百度贴吧]部分CPU的SPEC2006int 结果

这些测试成绩基本上是本人自己测试的结果。下表中有来自spec官网的两个成绩,因为测试年份较早,系统环境和编译器都较老,测试成绩本人实测的还差,所以仅作为参考。部分测试启用了自动并行和附加的优化库,是为了追求较好的测试成绩,体现的不是普通用户系统环境和常规应用软件的性能水平。国产CPU任重道远,从当前

申威3231_SPECJVM2008的测试结果与信创服务器对比验证

# 申威3231_SPECJVM2008的测试结果与信创服务器对比验证 ## 背景 ``` 周六找同事将在公司里的机器进行了开机. 然后验证了config.guess和config.sub 的确是可以通过复制/usr 下面的文件进行解决的 但是perl的很多model无法使用. 所以没办法, 准备测

stress-NG 磁盘测试结果-全国产信创部分验证

# stress-NG 磁盘测试结果 ## 摘要 ``` 前几天分别还是用了redis-benchmark还有specjvm2008进行了多种系统的压测 得出了信创CPU的一些简单结论 但是一直还没有压测磁盘, 今天想着使用stress-NG压测一下不同架构的信创服务器的磁盘清空. 在网卡还没到打瓶