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


    过滤器(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)
        {
            // 在控制器方法执行后执行的代码
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

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

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

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

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

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

    public class MyController : ControllerBase
    {
        [TypeFilter(typeof(MyActionFilter))] // 仅在这个方法上应用过滤器
        public IActionResult MyAction()
        {
            // 方法逻辑
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    三.跳过过滤器

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

    public class MyController : ControllerBase
    {
        [TypeFilter(typeof(MyActionFilter))] // 仅在这个方法上应用过滤器
        public IActionResult MyAction()
        {
            // 方法逻辑
        }
        
        public IActionResult MyAction1()
        {
            // 方法逻辑
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

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

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

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

    [TypeFilter(typeof(MyActionFilter))] //整个过滤器都过滤
    public class MyController : ControllerBase
    {
        // 这个操作方法将跳过过滤器
        [SkipFilter]
        public IActionResult SomeAction()
        {
            // 操作方法的代码
        }
    
        // 这个操作方法将不会跳过过滤器
        public IActionResult AnotherAction()
        {
            // 操作方法的代码
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

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

    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)
        {
            // 在控制器方法执行后执行的代码
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    Python(五)——运算符的使用
    Spire Office 7.5.4 for NET
    2024年,我又开始用Linux桌面作为主力系统了~
    HTML学生作业网页 传统端午节节日 学生节日网页设计作业源码(HTML+CSS+JS)
    vue.js 短连接 动态连接
    CNN 理解神经网络中卷积(大小,通道数,深度)
    访问控制1
    【每日一题】包含所有字符的最小子串长度
    【必知必会的MySQL知识】⑤DQL语言
    flutter 自定义加载中间页 loading 菊花组件的封装
  • 原文地址:https://blog.csdn.net/qq_39569480/article/details/132875786