微软官网例子: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

(检测权限)在方法执行之前进行判断

例如:

最新文章

  1. ubuntu安装libxml2--PC端
  2. 漫谈Linux内核哈希表(1)
  3. 如何彻底删除antlr-2.7.2.jar
  4. 使用redis和fastjson做应用和mysql之间的缓存
  5. MVC3中在同一解决方案的不同项目中实现Area功能
  6. mysql 导出,导入数据
  7. xampp 命令行修改数据库密码
  8. Proxy SwitchySharp chrome网络代理【转】
  9. Use Prerender to improve AngularJS SEO
  10. (ubuntu)linux C编程之sleep()和usleep()的使用和区别
  11. js中window对象的opener属性的一个坑
  12. C. Multi-Subject Competition 思维+前缀和+填表加减复杂度(复杂度计算错误)
  13. Starting MySQL....The server quit without updating PID file[失败]/lib/mysql/ip12189.pid). 错误一例
  14. 用Java给数组排序
  15. 2018.11.24 poj3261Milk Patterns(后缀数组)
  16. 【教程向】——基于hexo+github搭建私人博客
  17. 最短路径算法----Dijkstra (转)
  18. Java中的枚举使用详解
  19. Android 华为U8818真机调试 无法打印Logcat
  20. c++11特性与cocos2d-x 3.0之std::bind与std::function

热门文章

  1. 基于python3.7利用Motor来异步读写Mongodb提高效率
  2. 【AGC】引导用户购买提升用户留存率
  3. Luogu1064 金明的预算方案 (有依赖的背包)
  4. host,nslookup,dig 工具安装
  5. Bert不完全手册7. 为Bert注入知识的力量 Baidu-ERNIE &amp; THU-ERNIE &amp; KBert
  6. HCNP Routing&amp;Switching之MAC安全
  7. day27--Java集合10
  8. CSP2021-S游记
  9. MixCSE:困难样本在句子表示中的使用
  10. BI如何实现用户身份集成自定义安全程序开发