.NET修仙传
修炼秘籍
.net 修炼路线图
书籍大全
C#入门后该如何进阶?如何提升自己?
读写 Excel 四种方案
书籍大全
dotnet命令大全
C# 程序集加载方法
linux 下部署.net环境
.NET WebAPI中FromRoute、FromQuery、FromBody的关键角色与用法
C# 新用法
盘点C#最有价值的10个语法糖
C#基础语法与数据类型
序列化
C# 7.0
模式匹配Pattern Matching
优秀实用的类库推荐
2024年C#优秀实用的类库推荐
依赖注入与中间件
依赖注入
查询所有已注入的服务
WebApi实现批量注入
原生依赖注入
自动依赖注入框架
优秀中间件
依赖注入
Autofac
生命周期
文档操作
PDF操作
PDF合并及生成书签目录
Excel操作
几个Excel文件合并去重分类
Excel文件之COM组件方式
操作Excel文件之NPOI
INI文件
面试宝典
WebService、WCF、WebAPI、一般处理程序
C# 线程和进程的区别
asp.net core 服务生命周期
asp.net core 的中间件都有哪些
操作系统编程
获取搜狗输入法中英文
com组件集成
执行系统命令
通过句柄嵌入exe窗体程序
windows-开机自启动
程序调用cmd命令生成WCF服务的客户端调用文件
获取电脑信息
键盘记录器
键盘改键功能
监听鼠标操作
框架揭秘
01编程初体验
中间件 Middleware
路由
配置管理
配置系统
配置管理
日志管理
Log4Net
NLog
.net core原始日志记录
日志管理
Serilog
LINQ
LINQ概讲
LINQ编程
常用方法
ORM
EF Core初始化
EF Core的实体类配置
执行原生SQL语句
EF Core
操作sqlite
操作Mysql数据库
操作LiteDB
AutoMapper高效实现对象映射
AutoMapper
AutoMapper 10个常用方法总结
缓存
Redis支持哪几种数据类型?
什么是Redis?简述它的优缺点?
Redis相比memcached有哪些优势?
认证
什么是 JWT?它是如何工作的?
.net framework jwt
.net core Jwt操作
认证管理
.Net WebApi校验Token/参数的几种方式
鉴权授权
Authorization的几种方式
基础语法
集合
1、C#中常用集合类型
yield return 简化迭代并提高代码质量
AOP
.net core AOP
操作筛选器
网络编程
TCP 连接的前世今生
HttpRequest,WebRequest,HttpWebRequest,WebClient,HttpClient 之间的区别
网络编程
WebApi获取客户信息
通信
HTTP通信
公共类-HttpHelper
多线程编程
十种线程方式分析
Task-筑基期
parallel-筑基
消息队列
Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点?
构建高性能 API 的高级技术
优秀教程网站
每日学习地址
全套教程汇总
理解ASP.NET Core
定时任务
定时器的三种使用方式
定时任务之windows任务计划程序
创建任务到Windows任务计划程序
定时任务之Quartz.Net
IHostedService启动时运行定时任务
JSON序列化反序列化工具
前辈
发布部署
应用部署
GRPC
使用GRPC多个proto文件
本文档使用 MrDoc 发布
-
+
首页
.net core AOP
AOP,即面向切面编程 ```mindmap>400 # 自定义 ## IAuthorizationFilter ## IResourceFilter ## IExceptionFilter ## IActionFilter ## IResultFilter # 内置Filter特性 ## ActionFilterAttribute ## ExceptionFilterAttribute ## ResultFilterAttribute ## FormatFilterAttribute ## ServiceFilterAttribute ## TypeFilterAttribute ``` # 定义过滤器 | 列名 | 列名 | 列名 | 列名 | | --- | --- |--- | --- | | 1 | Authorization Filter | 授权过滤器| 用于身份验证和授权,是五种Filter中优先级最高的 | | 2 | Resource Filter |资源过滤器 | 在Action执行前后进行资源处理,如资源缓存、防盗链等。 | | 3 | Exception Filter | 异常过滤器 |用于全局的异常处理,捕获并处理未捕获的异常 | | 4 | Action Filter | 操作过滤器 |在Action执行前后进行拦截,常用于执行操作日志、参数验证等。 | | 5 | Result Filter | 结果过滤器 | 在Action结果返回前后进行拦截,常用于对结果进行格式化,大小写转换等操作。 |    ```java public class AuthonizationFilter :Attribute,IAuthorizationFilter { public void OnAuthorization(AuthorizationFilterContext context) { //这里可以做复杂的权限控制操作 if (context.HttpContext.User.Identity.Name != "1") //简单的做一个示范 { //未通过验证则跳转到无权限提示页 RedirectToActionResult content = new RedirectToActionResult("NoAuth", "Exception", null); context.Result = content; } } } public class ResourceFilter : Attribute,IResourceFilter { public void OnResourceExecuted(ResourceExecutedContext context) { // 执行完后的操作 } public void OnResourceExecuting(ResourceExecutingContext context) { // 执行中的过滤器管道 } } public class ExecptionFilter : Attribute, IExceptionFilter { private ILogger<ExecptionFilter> _logger; //构造注入日志组件 public ExecptionFilter(ILogger<ExecptionFilter> logger) { _logger = logger; } public void OnException(ExceptionContext context) { //日志收集 _logger.LogError(context.Exception, context?.Exception?.Message??"异常"); } } public class ActionFilter : Attribute, IActionFilter { public void OnActionExecuted(ActionExecutedContext context) { //执行完成.... } public void OnActionExecuting(ActionExecutingContext context) { //执行中... } } public class ResultFilter : Attribute, IResultFilter { public void OnResultExecuted(ResultExecutedContext context) { // 在结果执行之后调用的操作... } public void OnResultExecuting(ResultExecutingContext context) { // 在结果执行之前调用的一系列操作 } } ``` # 注册过滤器 - 全局:将作用于所有请求的action - controller:将作用于这个controller下的所有action - action:作用于单个action ## 全局注册 ```java builder.Services.AddMvc(options => options.Filters.Add<FilterAttribute>();); ``` ## Controller 注册方式 ```java [Route("api/[controller]")] [ApiController] [Filter]//添加过滤器特性,该控制器的所有方法自动走该过滤器 public class FilterAttributeController : ControllerBase { [HttpGet] [Filter]//添加过滤器特性,该方法自动走该过滤器 public string G_Method1() => return "1"; } ``` ## action 注册方式 ```java [Route("api/[controller]")] [ApiController] public class FilterAttributeController : ControllerBase { [HttpGet] [Filter]//添加过滤器特性,该方法自动走该过滤器 public string G_Method1() => return "1"; } ``` # TypeFilter 和 ServiceFilter 这两个特性都可以实现自定义过滤器的局部注入,但有不同: - ServiceFilter和TypeFilter都实现了IFilterFactory - ServiceFilter需要对自定义的Filter进行注册,TypeFilter不需要 - ServiceFilter的Filter生命周期源自于您如何注册,而TypeFilter每次都会创建一个新的实例 ```java //在Program.cs中必须先注册MyFilter这个过滤器到服务容器中 builder.Services.AddSigleton<MyFilter>(); //控制器方法上用ServiceFilter注入自定义过滤器 [ServiceFilter(typeof(MyFilter))] public IActionResult Index() { //一些处理 ... return Ok(); } //控制器方法上用TypeFilter注入自定义过滤器 [TypeFilter(typeof(MyFilter),IsReusable = true)] public IActionResult Index() { //一些处理 ... return Ok(); } ``` # Filter特性 - ActionFilterAttribute :行为过滤器特性 - ExceptionFilterAttribute:异常过滤器特性 - ResultFilterAttribute:结果过滤器特性 - FormatFilterAttribute:响应格式化过滤器特性 - ServiceFilterAttribute:用来局部使用过滤器的特性 - TypeFilterAttribute:也是用来局部注入过滤器的特性 ```java // 继承了一个 ActionFilterAttribute,这个抽象类继承了什么接口呢? //ResponseHeaderAttribute是一个自定义特性,[ResponseHeader] public class ResponseHeaderAttribute : ActionFilterAttribute { private readonly string _name; private readonly string _value; /// 构造函数 public ResponseHeaderAttribute(string name, string value) { (_name, _value) = (name, value); //元组赋值法 } // 结果过滤器里边的 结果被执行前 public override void OnResultExecuting(ResultExecutingContext context) { //添加响应头,键值对信息 (你对HTTP协议了解多少??) context.HttpContext.Response.Headers.Add(_name, _value); base.OnResultExecuting(context); } } //在控制器上应用 [ResponseHeader("Filter-Header", "Filter Value")] public class UserController : ControllerBase { public IActionResult Index() =>Content("请通过浏览器F12调试工具查看输出的响应头信息"); // ... //也可以在方法上面应用 [ResponseHeader("Another-Filter-Header", "Another Filter Value")] public IActionResult Multiple() => Content("请通过浏览器F12调试工具查看输出的响应头信息"); } ```
孙端己
2024年8月15日 16:41
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码