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

在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.mzph.cn/news/848054.shtml

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

相关文章

Spark中把所有的列转换成string操作

##事例代码 from pyspark.sql.functions import col df.select(*[col(c).cast("string").alias(c) for c in df.columns]) 这段代码使用了Spark SQL中的select函数和列表推导式来选择DataFrame中的所有列&#xff0c;并将它们的数据类型转换为字符串类型。 select(*…

案例分享:需求管理工具Jama Connect助力某财富100强的半导体巨头缩短项目周期、降低开发成本,提高需求复用率及可追溯性

案例分享&#xff1a;作为全球领导者&#xff0c;该财富100强公司以扩大其在移动技术领域的领导力和影响力为使命&#xff0c;该领域是其行业中增长最快的细分市场。公司有超过2,100名工程师、设计师和利益相关者通过使用Jama Connect加速产品开发。 成果概述&#xff1a; •…

数据新生态:Web3如何重新定义个人数据权利

随着数字化时代的不断深入&#xff0c;个人数据已经成为了现代社会中最宝贵的资源之一。然而&#xff0c;传统互联网时代下&#xff0c;个人数据往往被大型科技公司垄断、滥用&#xff0c;个人数据权利常常受到侵犯。而随着Web3技术的崛起&#xff0c;人们开始期待一种全新的数…

zynq固化问题

zynq固化&#xff0c;sd卡如果没有用gpio那么这个地方不能选 另外ddr型号一定要选对&#xff0c;不同的容量不一样

即时设计工具对决:Figma、Sketch与XD的优劣比较

最近几年&#xff0c;UI 设计工具出现了许多后起之秀&#xff0c;其中有四款更具代表性的UI设计软件&#xff1a;Sketch、Adobe XD、Figma 和 即时设计&#xff0c;这四个设计软件都有自己的优势。如果合作对您的UI设计过程至关重要&#xff0c;那么Figma 和 即时设计 它应该是…

React中常见的面试题

本文是结合实践中和学习技术文章总结出来的笔记(个人使用),如有雷同纯属正常((✿◠‿◠)) 喜欢的话点个赞,谢谢! 1. 约束性组件与非约束性组件 1.1. 非约束性组件 非约束性组件其实就是不能控制状态的组件,比如: <input type"text" defaultValue"123&qu…

JSP与Servlet的区别

一、技术难点 本质与结构&#xff1a; JSP&#xff08;Java Server Pages&#xff09;在本质上可以被视为一种特殊的Servlet。但两者的创建方式和结构存在显著差异。Servlet完全由Java程序代码构成&#xff0c;擅长于流程控制和事务处理&#xff1b;而JSP则是由JSP容器执行页面…

python身份证ocr接口功能免费体验、身份证实名认证接口

翔云人工智能API开放平台提供身份证实名认证接口、身份证识别接口&#xff0c;两者的相结合可以实现身份证的快速、精准核验&#xff0c;当用户在进行身份证实名认证操作时&#xff0c;仅需上传身份证照片&#xff0c;证件识别接口即可快速、精准的对证件上的文字信息进行快速提…

腾讯云centos上安装docker

下面的操作是在root用户下操作的,如果非root用户在命令行前加上sudo 1. 系统及内核查看 操作系统&#xff1a;64位的CentOS 7或更新版本。内核版本&#xff1a;最低要求是3.10&#xff0c;推荐使用3.10或更高版本。 #查看内核版本 (base) [klfwjfweaVM-0-6-centos ~]$ uname…

rk3568定时器

前言 本文记录的是用rk3568开发板做定时器实验 1 定时器理论知识 1.1系统节拍 在linux的kernel路径中,输入: make ARCH=arm64 menuconfig // 在内核路径下执行打开配置界面 选中“Timer frequency”,打开以后如图所示: 从图 14.1.1.1 可以看出,可选的系统节拍率为 100…

对i += i -i和i = i - 1的理解

i i & -i迭代的结果是每次加i的最低次&#xff0c;直到加到与i最近的2的次幂。 比如&#xff0c;初始i是65&#xff0c;迭代的i的值如下&#xff1a;66&#xff0c; 68&#xff0c; 72&#xff0c; 80&#xff0c; 96&#xff0c;128&#xff0c; 256&#xff0c; 512 ..…

派派派森03

1.JSON数据 Python数据和Json数据的相互转化 # 导入json模块 import json#准备符合json格式要求的python数据 data [{"name": "老王", "age": 16}, {"name": "张三", "age": 20}]# 通过json.dump(data)方法把pyt…

配置无密码 sudo

配置无密码 sudo 需要谨慎操作&#xff0c;因为这会给你的系统安全带来一定的风险。在决定这么做之前&#xff0c;请确保你了解潜在的安全后果。以下是具体操作步骤&#xff1a; 步骤1: 使用 visudo 编辑 sudoers 文件 visudo 是一个命令行工具&#xff0c;它用于安全地编辑 …

黑龙江等保测评有哪些内容?

与等保1.0相比&#xff0c;新的等保2.0版本有了很大的变化&#xff0c;评估的内容、评估的标准也有了很大的差异。那么新版的《等保2.0》实施后&#xff0c;我们要测试什么&#xff1f; 等保测评首先是有十个大项&#xff0c;安全物理环境&#xff0c;安全区域边界&#xff0c;…

(echarts)图上数值显示单位

&#xff08;echarts&#xff09;图上数值显示单位 series: [{name: 比例,type: bar,...label: {show: true,position: top,formatter: (params) > params.value % //图上数值显示格式},tooltip: { //鼠标移入图上数值显示格式valueFormatter: function(value) {return val…

mysql解决深度分页的问题

limit深分页为什么会变慢&#xff1f; 例如&#xff1a;一条sql&#xff1a; select id,name,age, from user where age >10 limit (10000,10); 首先这条sql肯定是比较慢的&#xff0c;因为它经过了很多次的回表。 sql执行流程&#xff1a; 1&#xff1a;先通过普通索引…

Ant-Design-Vue 动态表头并填充数据

在现代前端开发中&#xff0c;动态表格是一个常见需求&#xff0c;尤其是在处理大量数据和需要灵活展示时。Ant-Design-Vue 作为一个基于 Vue 的 UI 组件库&#xff0c;提供了强大的表格组件 a-table&#xff0c;使得实现动态表头和数据填充变得简单高效。本文将详细介绍如何使…

数据分析------统计学知识点(三)

相关性分析 1.趋势分析与散点图 散点图可帮助我们发现和理解变量间的关系&#xff0c;可直观观察是否有相关性。 &#xff08;1&#xff09;散点图定义及组成要素 散点图是一种以点的形式在直角坐标系上表示两个数值变量间关系的图表 横坐标&#xff08;x轴&#xff09;&a…

SQL小白10分钟快速入门

SQL&#xff08;Structured Query Language&#xff09;是一种用于管理关系型数据库的标准化编程语言。以下是SQL的入门基础教程&#xff0c;涵盖了一些基本概念和常用操作。 1. 数据库和表 数据库&#xff08;Database&#xff09;&#xff1a;一个存储数据的容器。表&#…

【JavaScript脚本宇宙】领先的静态网站构建工具:全面对比

静态站点生成器大解析&#xff1a;找出哪一款最适合你 前言 本文将探讨六种不同的静态站点生成器和React框架&#xff0c;包括Gatsby&#xff0c;Next.js&#xff0c;Jekyll&#xff0c;Hugo&#xff0c;Hexo和Eleventy。这些工具各有特色&#xff0c;提供了丰富的功能和使用…