【AOP】ASP.NET Core中各种Filter(拦截器)

devtools/2024/9/23 1:35:41/

在ASP.NET Core中,Filter(过滤器)是一种强大的机制,允许你在请求处理管道中的特定阶段运行代码。这些过滤器提供了在请求的不同阶段执行逻辑的能力,比如授权、日志记录、异常处理等。ASP.NET Core 提供了多种类型的过滤器,每种类型都在请求处理管道的不同阶段运行。

以下是ASP.NET Core中主要的过滤器类型:

  1. 授权过滤器(Authorization Filters)
    • 在其他过滤器之前执行。
    • 用于确定用户是否被授权访问请求的资源。
    • 实现IAuthorizationFilter接口。
public class MyAuthorizationFilter : IAuthorizationFilter
{public void OnAuthorization(AuthorizationFilterContext context){// 检查用户是否授权// 如果未授权,可以设置 context.Result 来停止请求处理}
}// 应用到控制器或动作方法
[ServiceFilter(typeof(MyAuthorizationFilter))]
public class MyController : ControllerBase
{// ...
}
  1. 资源过滤器(Resource Filters)
    • 在模型绑定之后和动作过滤器之前执行。
    • 用于处理需要在模型绑定后但动作执行前运行的代码(如缓存)。
    • 实现IResourceFilter接口。
    • 也可以实现IAsyncResourceFilter接口以支持异步操作。
public class MyResourceFilter : IResourceFilter
{public void OnResourceExecuting(ResourceExecutingContext context){// 在模型绑定之后,动作执行之前运行}public void OnResourceExecuted(ResourceExecutedContext context){// 在动作执行之后,结果执行之前运行}
}// 应用到控制器或动作方法
[ServiceFilter(typeof(MyResourceFilter))]
public class MyController : ControllerBase
{// ...
}
  1. 动作过滤器(Action Filters)
    • 在模型绑定和授权之后,但在视图结果执行之前运行。
    • 用于查看或修改传入的动作参数、调用的动作本身或动作结果。
    • 实现IActionFilter接口。
    • 也可以实现IAsyncActionFilter接口以支持异步操作。
public class MyActionFilter : IActionFilter
{public void OnActionExecuting(ActionExecutingContext context){// 在动作执行之前运行}public void OnActionExecuted(ActionExecutedContext context){// 在动作执行之后,结果执行之前运行}
}// 或者使用特性
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyActionFilterAttribute : Attribute, IActionFilter
{// ... 实现与上面相同
}// 应用到控制器或动作方法
[MyActionFilter]
public class MyController : ControllerBase
{// ...
}
  1. 异常过滤器(Exception Filters)
    • 当动作执行后发生未处理的异常时运行。
    • 用于处理未处理的异常,并提供一个替代的HTTP响应。
    • 实现IExceptionFilter接口。
public class MyExceptionFilter : IExceptionFilter
{public void OnException(ExceptionContext context){// 处理异常// 可以设置 context.Result 来提供替代的HTTP响应}
}// 应用到控制器或动作方法
[ServiceFilter(typeof(MyExceptionFilter))]
public class MyController : ControllerBase
{// ...
}
  1. 结果过滤器(Result Filters)
    • 在动作结果执行之后运行。
    • 用于查看或修改由动作方法返回的IActionResult
    • 实现IResultFilter接口。
    • 也可以实现IAsyncResultFilter接口以支持异步操作。
public class MyResultFilter : IResultFilter
{public void OnResultExecuting(ResultExecutingContext context){// 在结果执行之前运行}public void OnResultExecuted(ResultExecutedContext context){// 在结果执行之后运行}
}// 应用到控制器或动作方法
[ServiceFilter(typeof(MyResultFilter))]
public class MyController : ControllerBase
{// ...
}
  1. 全局异常处理器(Global Exception Handler)

    • 这并不是一个过滤器,但它是ASP.NET Core中处理全局异常的一种机制。
    • 通过配置UseExceptionHandler中间件来处理全局未处理的异常。
  2. 中间件(Middleware)

    • 虽然不是过滤器,但中间件是ASP.NET Core中处理请求和响应的另一种机制。
    • 中间件在请求处理管道中运行,并可以决定是否将请求传递给管道中的下一个组件,或者是否直接发送响应给客户端。
public class ErrorHandlingMiddleware
{private readonly RequestDelegate _next;public ErrorHandlingMiddleware(RequestDelegate next){_next = next;}public async Task InvokeAsync(HttpContext httpContext){try{await _next(httpContext);}catch (Exception ex){// 处理异常并返回适当的响应await HandleExceptionAsync(httpContext, ex);}}private static Task HandleExceptionAsync(HttpContext context, Exception exception){// 写入响应体或其他错误处理逻辑context.Response.StatusCode = StatusCodes.Status500InternalServerError;context.Response.ContentType = "text/plain";return context.Response.WriteAsync("Internal Server Error");}
}// 在Startup.cs中配置中间件
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{// ...app.UseMiddleware<ErrorHandlingMiddleware>();// ...
}

使用过滤器时,你可以通过特性(Attribute)将其直接应用于控制器或动作方法,或者通过全局配置将其应用于整个应用程序。这些过滤器提供了一种灵活且模块化的方式来扩展ASP.NET Core应用程序的功能。

请注意,对于使用ServiceFilter的过滤器,你需要在Startup.cs中的ConfigureServices方法中注册它们作为服务。例如:

public void ConfigureServices(IServiceCollection services)
{// ...services.AddScoped<MyAuthorizationFilter>();services.AddScoped<MyResourceFilter>();services.AddScoped<MyExceptionFilter>();// ...
}

而使用特性(Attribute)的过滤器则不需要在ConfigureServices中注册


http://www.ppmy.cn/devtools/46594.html

相关文章

Linux中,ll 命令 列出目录的内容

文章目录 1、2、3、4、5、 1、 在Linux中&#xff0c;ll 通常是一个别名&#xff08;alias&#xff09;用于 ls -l 命令。ls 命令用于列出目录的内容&#xff0c;而 -l 选项会以长格式&#xff08;long format&#xff09;显示信息&#xff0c;包括文件或目录的权限、所有者、…

【计算机网络】对应用层HTTP协议的重点知识的总结

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

二叉树讲解

目录 前言 二叉树的遍历 层序遍历 队列的代码 queuepush和queuepushbujia的区别 判断二叉树是否是完全二叉树 前序 中序 后序 功能展示 创建二叉树 初始化 销毁 简易功能介绍 二叉树节点个数 二叉树叶子节点个数 二叉树第k层节点个数 二叉树查找值为x的节点 判…

每天坚持写java锻炼能力---第一天(6.4)

今天的目标是菜单&#xff1a; B站/马士兵的项目菜单 package java1;import java.util.Scanner;public class Test {public static void main(String[] args) {while(true){ //3.加入死循环&#xff0c;让输入一直有System.out.println();System.out.println("--->项…

JavaSE——学习总结

一、初识Java 运行Java程序 Java是一门半编译型、半解释型语言 先通过javac编译程序把源文件进行编译&#xff0c;编译后生成的.class文件是由字节码组成的&#xff0c;和平台无关、面向JVM的文件&#xff0c;最后启动java虚拟机来运行.class文件&#xff0c;此时JVM会将字节…

Java线程池execute和submit的区别

前言 ThreadPoolExecutor提供了两种方法来执行异步任务&#xff0c;分别是execute和submit&#xff0c;也是日常开发中经常使用的方法&#xff0c;那么它俩有什么区别呢&#xff1f; 语义不同 首先是语义上的不同。execute声明在Executor接口&#xff0c;它接受一个Runnable…

【简单学习一下卷积神经网络】-基于肆十二的高考例子

前言一、白话卷积神经网络总结 前言 【参考】 主要是P2⇨手把手教你用tensorflow2训练自己的数据集 -------2024/5/4 一、白话卷积神经网络 高考前需要大量的做题训练---->相当于数据集。 做题过程中【于标准答案进行比对】产生的错题⇨loss&#xff08;误差&#xff09; 回…

【成品设计】基于华大hc32F005c6ua的读取NFC卡

《基于华大hc32F005c6ua的读取NFC卡》 整体功能&#xff1a; 单片机:华大hc32F005c6ua 1、支持单片机spi接口读取nfc读卡器芯片rc522读写数据 2、读取到的数据可以通过单片机uart接口通信&#xff0c;上报给上位机&#xff08;485主机&#xff09; 3、uart接口支持modbus协议…