C# net core中的过滤器(Filter)使用及跳过过滤器

2023-09-14 15:04:15

过滤器(Filters)是用于在ASP.NET Core应用程序中执行全局或局部的操作的组件。这些过滤器可以用于处理请求前、请求后、异常处理等不同的阶段。以下是.NET 5中常用的一些过滤器类型:

在 ASP.NET Core 中,过滤器是一种可以在特定的阶段处理请求的方法。它们在一个 action 方法执行之前或之后运行,可以用来处理错误、指定缓存设置、验证请求和响应,等等。

一.ASP.NET Core 提供了以下类型的过滤器:

1.授权过滤器
(Authorization filters):处理授权逻辑。

2资源过滤器
(Resource filters):在模型绑定之前和之后运行,通常用于缓存。

3操作过滤器
(Action filters):在 action 执行之前和之后运行。

4异常过滤器
(Exception filters):处理控制器或 action 中引发的异常。

5结果过滤器
(Result filters):在 action 的结果执行之前和之后运行。

6异常处理中的过滤器
(Exception Filters)
在 C# 的异常处理中,可以使用 catch 语句后跟一个 when 关键字来添加一个过滤器,该过滤器决定是否捕获异常。这允许你基于异常的属性或其他条件捕获异常。

二.操作过滤器(Action filters)示例

创建一个过滤器类:首先,你需要创建一个继承自IActionFilter、IResultFilter、IResourceFilter或IAsyncActionFilter、IAsyncResultFilter、IAsyncResourceFilter接口的自定义过滤器类。这取决于你希望过滤器在请求的哪个阶段执行。

这里我们创建一个在控制器方法执行前后执行的同步过滤器,可以创建一个类如下:

using Microsoft.AspNetCore.Mvc.Filters;

public class MyActionFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        // 在控制器方法执行前执行的代码
        
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        // 在控制器方法执行后执行的代码
    }
}

注册过滤器:要使用你的自定义过滤器,你需要在Startup.cs文件中的ConfigureServices方法中将它注册到应用程序服务集合中。这通常在AddControllers方法链中进行:

services.AddControllers(options =>
{
    options.Filters.Add(typeof(MyActionFilter)); // 注册你的自定义过滤器
});

应用过滤器:你可以在控制器或控制器的特定操作方法上应用过滤器,以便它们只在需要时执行。这可以通过使用[TypeFilter]特性来完成,这里有一点应用到controller上那么所有的action都要走过滤器如果不想让指定的action走过滤器该怎么搞呢?看下面的步骤:

[TypeFilter(typeof(MyActionFilter))] // 在整个控制器上应用过滤器
public class MyController : ControllerBase
{
    // 控制器方法
}

或者,你可以将过滤器应用于特定的操作方法:

public class MyController : ControllerBase
{
    [TypeFilter(typeof(MyActionFilter))] // 仅在这个方法上应用过滤器
    public IActionResult MyAction()
    {
        // 方法逻辑
    }
}

三.跳过过滤器

有时候我们把过滤器直接应用到了控制器上,但是呢部分的函数(action)又不想经过过滤器,这是该怎么做呢?有两种方案:
1.过滤器的特性不直接加在Controller上只加在特定的方法上就像上一步骤的介绍,只给需要过滤器的方法加特性

public class MyController : ControllerBase
{
    [TypeFilter(typeof(MyActionFilter))] // 仅在这个方法上应用过滤器
    public IActionResult MyAction()
    {
        // 方法逻辑
    }
    
    public IActionResult MyAction1()
    {
        // 方法逻辑
    }
}

2.重新编写一个过滤器,然后在主过滤器中判断

创建一个自定义的特性(Attribute),创建一个名为SkipFilterAttribute的特性。没有具体逻辑

[AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = false)]
public class SkipFilterAttribute : Attribute
{
}

然后,将这个特性应用到想要跳过过滤器的操作方法上。例如:

[TypeFilter(typeof(MyActionFilter))] //整个过滤器都过滤
public class MyController : ControllerBase
{
    // 这个操作方法将跳过过滤器
    [SkipFilter]
    public IActionResult SomeAction()
    {
        // 操作方法的代码
    }

    // 这个操作方法将不会跳过过滤器
    public IActionResult AnotherAction()
    {
        // 操作方法的代码
    }
}

在主过滤器中判断是否加了跳过过滤器的特性,如果有则不走主过滤器

public class MyActionFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        // 在执行操作之前调用
            if (context.ActionDescriptor.EndpointMetadata.Any(em => em.GetType() == typeof(SkipFilterAttribute)))
            {
                // 如果操作方法有SkipFilterAttribute特性,则跳过过滤器的执行
                return;
            }
		
		//如果没有加跳过的注解 就要走过滤了
		// 在控制器方法执行前执行的代码
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        // 在控制器方法执行后执行的代码
    }
}
更多推荐

网络安全深入学习第六课——热门框架漏洞(RCE— Weblogic反序列化漏洞)

文章目录一、Weblogic介绍二、Weblogic反序列化漏洞历史三、Weblogic框架特征1、404界面2、登录界面四、weblogic常用弱口令账号密码五、Weblogic漏洞介绍六、Weblogic漏洞手工复现1、获取账号密码,这是一个任意文件读取的漏洞1)读取SerializedSystemIni.dat文

面向对象的分析与设计(精品课程)第二章作业

面向对象的分析与设计(精品课程)第二章作业一.单选题(共4题,30.4分)二.多选题(共1题,7.6分)三.填空题(共5题,38分)四.简答题(共3题,24分)一.单选题(共4题,30.4分)(单选题)UML中的事物包括结构事物、分组事物、注释事物和()。A实体事物B边界事物C控制事物D动作事物(单选题)UML中的4种

Linux设备树OF操作函数

OF操作函数我们知道Linux内核使用设备树的形式去描述芯片硬件设备节点的各种属性,设备树的树形结构可以层次化的组织这些节点属性。设备树源码属于脚本格式的文件,Linux内核无法直接使用脚本格式,所以最终使用时需要将设备树源码编译为二进制的“.dtb”格式,最终Uboot将".dtb"格式设备树传递给Linux内核使用

pdf文件可以压缩大小吗?pdf压缩方法分享

在日常生活和工作中,我们经常需要处理大量的PDF文件。有时候,一个PDF文件的大小可能超过了几十MB,甚至无法通过电子邮件发送。那么,如何有效地压缩PDF文件大小呢?本文将为你介绍三个简单易行的方法,帮助你轻松搞定PDF文件压缩大小的问题。首先,我们需要了解PDF文件的相关概念,PDF是一种可移植文档格式,可以跨平台、

Anaconda安装和配置 ---- 详细到家

安装1.打开Anaconda官网,选择对应版本,下载到对应目录即可或者进入:Indexof/anaconda/archive/|清华大学开源软件镜像站|TsinghuaOpenSourceMirror2.双击打开.exe文件,然后点击next;3.点击agree4.点击justme,然后next;5.在ChooseIn

热电偶的工作原理

当有两种不同的导体或半导体A和B组成一个回路,其两端相互连接时,只要两结点处的温度不同,一端温度为T,称为工作端或热端,另一端温度为T0,称为自由端(也称参考端)或冷端,回路中将产生一个电动势,该电动势的方向和大小与导体的材料及两接点的温度有关。这种现象称为“热电效应”,两种导体组成的回路称为“热电偶”,这两种导体称为

ruoyi框架使用自定义用户表登录

背景有的时候我们做框架升级或改造的时候,需要用到原来的部分表,比如只是用ruoyi的框架,然后登录的用户逻辑还是想用自己的表,那么接下来这边文章将介绍修改逻辑。修改教程1、SysLoginController.java大家找到这个login方法,这是controller的入口。/***登录方法**@paramlogin

ElasticSearch进阶:一文全览各种ES查询在Java中的实现

ElasticSearch进阶:一文全览各种ES查询在Java中的实现ElasticSearch进阶:一文全览各种ES查询在Java中的实现es基本语句详解查询语句详解前言ElasticSearch第一篇:ElasticSearch基础:从倒排索引说起,快速认知ES完整项目已上传至:ElasticSearchDemo项

代码随想录算法训练营第三十六天| 435. 无重叠区间 763.划分字母区间 56. 合并区间

今天的三道题目,都算是重叠区间问题,大家可以好好感受一下。都属于那种看起来好复杂,但一看贪心解法,惊呼:这么巧妙!还是属于那种,做过了也就会了,没做过就很难想出来。不过大家把如下三题做了之后,重叠区间基本上差不多了435.无重叠区间与引爆气球相似,差不多;代码随想录publicinteraseOverlapInterv

上新!100%国产物料认证,米尔入门级国产核心板全志T113-i方案

自米尔国产全志T113系列的核心板发布以来,这款高性价比、低成本、入门级、高性能的国产核心板咨询不断,配套的开发板已经成交量数百套,深受工程师们的青睐,为了集齐T113全系列的产品,这次米尔发布了基于全志T113-i处理器的核心板和开发板,让广大工程师有了更多的选择。接下来看看这款T113-i国产核心板的性能和优势。M

ETHERNET IP站转CCLKIE协议网关

产品介绍JM-EIP-CCLKIE是自主研发的一款ETHERNET/IP从站功能的通讯网关。该产品主要功能是实现CCLINKIEFB总线和ETHERNET/IP网络的数据互通。本网关连接到ETHERNET/IP总线中做为从站使用,连接到CCLINKIEFB总线中做为从站使用。产品参数技术参数l网关做为ETHERNET/

热文推荐