Filter 筛选器(一)之 ActionFilter-- IAsyncActionFilter 和 ActionFilterAttribute
2024-10-20 06:34:53
微软官网例子:Filter筛选器
使用场景(执行顺序):
IAsyncActionFilter
使用异步actionFilter 只需要实现 他的 :OnActionExecutionAsync 方法 (注意这里的异步不是拦截异步是指的是 当前OnActionExecutionAsync方法内执行的内容是异步的)
例如:我在这里注入两个 ActionbFliter (MyActionFilter1 和 MyActionFilter2)
注意 : 多个Filter 执行是一个链路形式的
MyActionFilter1
public class MyActionFilter1 : IAsyncActionFilter
{
public async Task OnActionExecutionAsync(ActionExecutingContext context,
ActionExecutionDelegate next)
{
Console.WriteLine("MyActionFilter 1:开始执行");
ActionExecutedContext r = await next(); //如果执行 下一个ActionFilter
if (r.Exception != null)
{
Console.WriteLine("MyActionFilter 1:执行失败");
}
else
{
Console.WriteLine("MyActionFilter 1:执行成功");
}
}
}
MyActionFilter2
public class MyActionFilter2 : IAsyncActionFilter
{
public async Task OnActionExecutionAsync(ActionExecutingContext context,
ActionExecutionDelegate next)
{
Console.WriteLine("MyActionFilter 2:开始执行");
ActionExecutedContext r = await next();
if (r.Exception != null)
{
Console.WriteLine("MyActionFilter 2:执行失败");
}
else
{
Console.WriteLine("MyActionFilter 2:执行成功");
}
}
}
可以看到多个执行的效果
如上图,他是一个链路形式 !
也可以使用 ActionFilterAttribute
可以看到 ActionFilterAttribute 包含了 IAsyncActionFilter 接口 和 IAsyncResultFilter 接口
例子 :
public class ActionAttribute : ActionFilterAttribute
{
private readonly ILogger<HandleActionAttribute> _logger;
public HandleActionAttribute(ILogger<ActionAttribute> logger)
{
_logger = logger;
}
// 这里需要重写父类的 virtual OnActionExecutionAsync() 方法
public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
HttpRequest request = ((Microsoft.AspNetCore.Mvc.ControllerBase)context.Controller).Request;
AuthParam param = GetParameters(request);
CheckParameters(param);
//逻辑处理 省略
await base.OnActionExecutionAsync(context, next);
}
调用的时候
[TypeFilter(typeof(ActionAttribute))]
Demo
一般我们程序会使用两个Filter
(检测权限)在方法执行之前进行判断
例如:
最新文章
- ubuntu安装libxml2--PC端
- 漫谈Linux内核哈希表(1)
- 如何彻底删除antlr-2.7.2.jar
- 使用redis和fastjson做应用和mysql之间的缓存
- MVC3中在同一解决方案的不同项目中实现Area功能
- mysql 导出,导入数据
- xampp 命令行修改数据库密码
- Proxy SwitchySharp chrome网络代理【转】
- Use Prerender to improve AngularJS SEO
- (ubuntu)linux C编程之sleep()和usleep()的使用和区别
- js中window对象的opener属性的一个坑
- C. Multi-Subject Competition 思维+前缀和+填表加减复杂度(复杂度计算错误)
- Starting MySQL....The server quit without updating PID file[失败]/lib/mysql/ip12189.pid). 错误一例
- 用Java给数组排序
- 2018.11.24 poj3261Milk Patterns(后缀数组)
- 【教程向】——基于hexo+github搭建私人博客
- 最短路径算法----Dijkstra (转)
- Java中的枚举使用详解
- Android 华为U8818真机调试 无法打印Logcat
- c++11特性与cocos2d-x 3.0之std::bind与std::function
热门文章
- 基于python3.7利用Motor来异步读写Mongodb提高效率
- 【AGC】引导用户购买提升用户留存率
- Luogu1064 金明的预算方案 (有依赖的背包)
- host,nslookup,dig 工具安装
- Bert不完全手册7. 为Bert注入知识的力量 Baidu-ERNIE &; THU-ERNIE &; KBert
- HCNP Routing&;Switching之MAC安全
- day27--Java集合10
- CSP2021-S游记
- MixCSE:困难样本在句子表示中的使用
- BI如何实现用户身份集成自定义安全程序开发