ASP.NET Core 6.0 使用 Action过滤器

news2024/10/6 6:05:39

Action过滤器

在ASP.NET Core中,Action过滤器用于在执行Action方法之前或之后执行逻辑。你可以创建自定义的Action过滤器来实现这一点。

继承 ActionFilterAttribute 类:

        [TypeFilter(typeof(CustomAllActionResultFilterAttribute))]
        public IActionResult Index4(int i)
        {
            return Json(new
            {
                Id = 1,
                Name = "Tom",
                Age = 18
            });
        }

 写日志

public class CustomAllActionResultFilterAttribute:ActionFilterAttribute
{
    private readonly ILogger<CustomAllActionResultFilterAttribute> _ILogger;
    public CustomAllActionResultFilterAttribute(ILogger<CustomAllActionResultFilterAttribute> iLogger)
    {
        this._ILogger = iLogger;
    }


    public override void OnActionExecuting(ActionExecutingContext context)
    {
        var para = context.HttpContext.Request.QueryString.Value;
        var controllerName = context.HttpContext.GetRouteValue("controller");
        var actionName = context.HttpContext.GetRouteValue("action");
        _ILogger.LogInformation($"执行{controllerName}控制器--{actionName}方法;参数为:{para}");
    }

    public override void OnActionExecuted(ActionExecutedContext context)
    {
        var result = Newtonsoft.Json.JsonConvert.SerializeObject(context.Result);
        var controllerName = context.HttpContext.GetRouteValue("controller");
        var actionName = context.HttpContext.GetRouteValue("action");
        _ILogger.LogInformation($"执行{controllerName}控制器--{actionName}方法:执行结果为:{result}");
    }

    public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        var controllerName = context.HttpContext.GetRouteValue("controller");
        var actionName = context.HttpContext.GetRouteValue("action");

        var para = context.HttpContext.Request.QueryString.Value;
        _ILogger.LogInformation($"执行{controllerName}控制器--{actionName}方法;参数为:{para}");

        ActionExecutedContext executedContext = await next.Invoke(); //这句话执行就是去执行Action  

        var result = Newtonsoft.Json.JsonConvert.SerializeObject(executedContext.Result);
        _ILogger.LogInformation($"执行{controllerName}控制器--{actionName}方法:执行结果为:{result}");
    }


    public override void OnResultExecuting(ResultExecutingContext context)
    {
        base.OnResultExecuting(context);
    }

    public override void OnResultExecuted(ResultExecutedContext context)
    {
        base.OnResultExecuted(context);
    }

    public override Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
    {
        return base.OnResultExecutionAsync(context, next);
    }
}

AlwaysRunResultFilter扩展定制

在之前学过的ActionFilter/ResourceFilter中只要是对HttpContext.Result赋值,就不再继续往后了。

在ASP.NET Core中,AlwaysRunResultFilter是一个实现了IAlwaysRunResultFilter接口的特性,它用于在执行结果执行之后执行一些操作,无论结果是否执行成功。

        [CustomCacheResourceFilter]
        [CustomAlwaysRunResultFilter]
        public IActionResult Index5()
        {
            return Json(new
            { 
                Id =1,
                Name ="Tom",
                Age = 18
            });
        }
    public class CustomAlwaysRunResultFilterAttribute : Attribute, IAlwaysRunResultFilter
    {
        public void OnResultExecuting(ResultExecutingContext context)
        {
            Console.WriteLine("CustomAlwaysRunResultFilterAttribute.OnResultExecuting");
        }
        public void OnResultExecuted(ResultExecutedContext context)
        {
            Console.WriteLine("CustomAlwaysRunResultFilterAttribute.OnResultExecuted");
        }
    }

Filter的多种注册

AOP:在不修改之前的代码为基础上,动态增加功能,但是我们现在做的无论是ResourceFilter还是ActionFilter都是直接标记在方法上的,现在需要的是对某一些Action、或者对于某个项目整体生效。

方法注册:仅对当前方法生效

        [CustomCacheResourceFilter]
        [CustomAlwaysRunResultFilter]
        public IActionResult Index5()
        {
            return Json(new
            { 
                Id =1,
                Name ="Tom",
                Age = 18
            });
        }


控制器(类)注册:对当前控制器下的所有Action都生效


全局注册:对于项目中的所有方法都生效,在Program.cs文件

// Add services to the container.
builder.Services.AddControllersWithViews(mvcOptions => 
{
    // 3.全局注册--对整个项目都生效的
    mvcOptions.Filters.Add<CustomCacheResourceFilterAttribute>();
});

匿名支持

单个Action注册是对于某一个Action生效,但是控制器、全局注册都是生效一大片。
那么在这样生效一部分中,如果希望在全局或者控制器注册后,其中有部分Action不生效,该怎么处理。(匿名支持)
系统提供了AllowAnonymousAttribute,有部分可以使用,有部分不能直接使用。

namespace Learn.NET6.Project.Utility.Filters
{
    public class CustomAllowAnonymousAttribute: Attribute
    {
    }
}
        #region 匿名支持
        /// <summary>
        /// 不支持缓存
        /// </summary>
        /// <returns></returns>
        //[AllowAnonymous]
        [CustomAllowAnonymous]
        public IActionResult Index6()
        {
            return Json(new
            { 
                Id =1,
                Name ="Tom",
                Age=18
            });
        }
        #endregion

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1878609.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

李秘书专业写作:关于晋升受阻或不公待遇的申诉(范文)

李秘书专业写作&#xff1a;关于晋升受阻或不公待遇的申诉&#xff08;范文&#xff09; 尊敬的公司领导&#xff1a; 您好&#xff01; 我谨以此信向公司提出申诉&#xff0c;关于我在近期晋升职位时遭受的不公待遇。我深感自己的辛勤付出和优异业绩未得到应有的认可&#…

Python逻辑控制语句 之 判断语句--if 嵌套

1.if 嵌套介绍 在⼀个if(elif else) 语句中 嵌套另⼀个 if(elif else ) 语句判断条件存在递进关系才会使⽤. 即 只有第⼀个条件成⽴,才会判断第⼆个条件 应用场景&#xff1a;在之前条件满足的前提下 &#xff0c;再增加额外的判断 2.if 嵌套语法 if 判断条件1: 判断条件1成立…

【Kubernetes学习】

K8S基础概念一 一、k8s是什么&#xff1f;二、k8s功能三、k8s组件四、k8s概念总结 一、k8s是什么&#xff1f; kubernetes&#xff0c;简称k8s&#xff0c;是一个全新的基于容器技术的分布式架构领先方案&#xff0c;是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本…

昇思25天学习打卡营第7天|linchenfengxue

Vision Transformer图像分类 1.Vision Transformer&#xff08;ViT&#xff09;简介 近些年&#xff0c;随着基于自注意&#xff08;Self-Attention&#xff09;结构的模型的发展&#xff0c;特别是Transformer模型的提出&#xff0c;极大地促进了自然语言处理模型的发展。由…

Zynq7000系列FPGA中的DMA控制器简介(二)

AXI互连上的DMA传输 所有DMA事务都使用AXI接口在PL中的片上存储器、DDR存储器和从外设之间传递数据。PL中的从设备通过DMAC的外部请求接口与DMAC通信&#xff0c;以控制数据流。这意味着从设备可以请求DMA交易&#xff0c;以便将数据从源地址传输到目标地址。 虽然DMAC在技术…

pdf拆分,pdf拆分在线使用,pdf拆分多个pdf

在数字化的时代&#xff0c;pdf文件已经成为我们日常办公、学习不可或缺的文档格式。然而&#xff0c;有时候我们可能需要对一个大的pdf文件进行拆分&#xff0c;以方便管理和分享。那么&#xff0c;如何将一个pdf文件拆分成多个pdf呢&#xff1f;本文将为你推荐一种好用的拆分…

033基于SSM+Jsp的多用户博客个人网站

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

Java----面向对象----总复习

面向对象 面向对象的程序设计思想(Object Oriented Programming),简称OOP.是一种设计者思想.关注的焦点是类,参照现实中的事务,将事务的属性特征,行为抽象出来,用类来表示.代码结构:以类为组织单位,每种事务都有自己的属性和行为,功能, 思想:从宏观上 帮助我们把握,整体分析整…

独家原创 | Matlab实现CNN-Transformer多变量时间序列预测

SCI一区级 | Matlab实现BO-Transformer-GRU多变量时间序列预测 目录 SCI一区级 | Matlab实现BO-Transformer-GRU多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CNN-Transformer多变量时间序列预测&#xff1b; 2.运行环境为Matlab2023b…

理解论文笔记:基于贝叶斯网络和最大期望算法的可维护性研究

看了与上一篇研究方向一致的文章,上一篇19年的,这一篇22年的更新。若有侵权,请联系删除。 I. INTRODUCTION 介绍 主要介绍了使用贝叶斯网络和历史数据对无线传感器网络可维护性研究的重要性和必要性,并对下面的各章进行了总结。 本文的其余部分组织如下:第二节论述…

对数函数转换公式

对数函数换底公式. 1. 2. 3. 以上公式可以由以下公式推导而来, 1. 2. 3. 4.

【Python系列】列表推导式:简洁而强大的数据操作工具

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Avue框架学习

Avue框架学习 我们的项目使用的框架是 Avue 在我看来这个框架最大的特点是可以基于JSON配置页面上的From,Table以及各种各样的输入框等,不需要懂前端就可以很快上手,前提是需要多查一下文档 开发环境搭建 由于我本地的环境全是用docker来搭建的,所以我依然选择用docker搭建我…

微软推出集成GPT-4o的文本转语音虚拟数字人服务

微软近日宣布&#xff0c;其全新的文本转语音虚拟数字人服务正式上线&#xff0c;并集成了GPT-4o技术。这一服务为用户提供了创建实时互动数字人的可能。通过先进的自然语言处理技术&#xff0c;数字人能够将文本转化为自然流畅的语音&#xff0c;并配以生动的虚拟形象&#xf…

Python 提取图片主色调

Python 提取图片主色调 效果代码编写 效果 有个要提取图片主色调的需求&#xff0c;记录一下。 代码编写 import numpy as np import cv2 from sklearn.cluster import KMeans from skimage.color import rgb2lab, deltaE_cie76 from collections import Counter# 创建默认…

寄存器相关知识点

文章目录 寄存器是什么&#xff1f;举例子—如何去看手册来配置寄存器寄存器地址知识点输出功能具体实现&#xff0c;在linux编写代码的话 其他 相关视频 寄存器是什么&#xff1f; 本质就是一个存储器&#xff0c;写内存和写指针都是一样的 寄存器里的值和RAM的值&#xff0c…

Android 11.0 修改系统显示大小导航栏消失

Android 11.0 修改系统显示大小导航栏消失 1.显示大小设置为大时&#xff0c;导航栏图标不显示。 设置为大&#xff0c;较大&#xff0c;最大时&#xff0c;导航栏图标不显示。 2.开始怀疑是导航栏被隐藏了&#xff0c;各种折腾无效。 3.发现&#xff1a; frameworks/base/pa…

springboot+vue 开发记录(八) 前端项目打包

本篇文章涉及到前端项目打包的一些说明 我打包后的项目在部署到服务器上后&#xff0c;访问页面时按下F12出现了这种情况&#xff1a; 它显示出了我的源码&#xff0c;这是一种很不安全的行为 该怎么办&#xff1f;很简单&#xff1a; 我们只需要下载一点点插件&#xff0c;再…

说说MQ在你项目中的应用(二)商品支付

看了不少关于MQ的文章&#xff0c;也对MQ的作用做了一些总结。通常来说MQ有三大功能&#xff1a;异步处理、系统解耦和流量削峰。但我觉得这些功能本质上都是围绕着异步这个核心来的&#xff0c;只是针对不同的业务场景做了些调整。 现在市面上常用的MQ中间件&#xff0c;如Ra…

大数据之Linux部署常用命令脚本封装

文章目录 编写集群命令执行脚本xcall集群命令执行1. 脚本需求2. 需求分析3. 脚本实现3.1 创建脚本存放目录3.2 编写xcall脚本3.3 修改脚本执行权限3.4 测试脚本 编写集群分发脚本xsync集群分发脚本1. 脚本需求2. 需求分析3. 脚本实现3.1 创建脚本存放目录3.2 编写xsync脚本3.3 …