.Net Core ResourceFilter

打印 上一主题 下一主题

主题 554|帖子 554|积分 1662


目录

作用



  • 在请求Authorize Filter后执行, 可以做缓存处理
  • ResourceFilter 在控制器实例化之前执行
  • ResourceFilter 可以在全局, Controller, Action 都可以设置, 并且都会执行(一个ResourceFilter可以重复设置)
如果都设置执行顺序为

  • 全局
  • Controller
  • Action
  • Action 方法
  • Action
  • Controller
  • 全局
实现

IAsyncResourceFilter


  • 需要继承 Attribute 并 并实现 IResourceFilter
  • 实现接口方法
执行顺序为:

  • OnResourceExecuting
  • Action
  • OnResourceExecuted
IAsyncResourceFilter


  • 需要继承 Attribute 并 并实现 IAsyncResourceFilter
  • 实现接口方法
  • 该接口只提供一个 OnResourceExecutionAsync方法,如果想执行ResourceExecutedContext方法,需要执行方法中ResourceExecutionDelegate委托并取返回值然后代码在执行为ResourceExecutedContext方法
执行顺序为:

  • OnResourceExecuting
  • Action
  • OnResourceExecuted
全局注册
  1. builder.Services.AddControllersWithViews(
  2.     options =>
  3.     {
  4.         //这样注册将对所有action 都生效
  5.         options.Filters.Add<CustomAsyncResourceFilterAttribute>();
  6.     }).AddControllersAsServices();
复制代码
如何取body参数

参考这个文章
Aop缓存简单示例

过滤器代码
  1. using Microsoft.AspNetCore.Mvc;
  2. using Microsoft.AspNetCore.Mvc.Filters;
  3. namespace Cnpc.Com.Ioc.WebApp.Filter
  4. {
  5.     public class CustomAsyncResourceFilterAttribute : Attribute, IAsyncResourceFilter
  6.     {
  7.         private static Dictionary<string, IActionResult?> cache = new Dictionary<string, IActionResult?>();
  8.         public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
  9.         {
  10.             {
  11.                 Console.WriteLine("方法前 Async");
  12.                 string user_id = context.HttpContext.Request.Query["User"];
  13.                 if (cache.ContainsKey(user_id))
  14.                 {
  15.                     context.Result = cache[user_id];
  16.                 }
  17.                 else
  18.                 {
  19.                     ResourceExecutedContext exected = await next();
  20.                     {
  21.                         Console.WriteLine("方法后 Async");
  22.                         cache[user_id] = exected.Result;
  23.                     }
  24.                 }
  25.             }
  26.         }
  27.     }
  28. }
复制代码
Action代码
  1. using Cnpc.Com.Ioc.WebApp.Filter;
  2. using Microsoft.AspNetCore.Mvc;
  3. namespace Cnpc.Com.Ioc.WebApp.Controllers
  4. {
  5.     [Route("api/[controller]/[action]")]
  6.     [ApiController]
  7.     public class TestFilterController : ControllerBase
  8.     {
  9.         [CustomAsyncResourceFilter]
  10.         [HttpPost]
  11.         public async Task<ActionResult<User?>> LoginIn(string user, string pwd)
  12.         {
  13.             Console.WriteLine("LoginIn");
  14.             await Task.CompletedTask;
  15.             Thread.Sleep(3000);  //测试缓存是否生效,第一次会等3秒, 下一次找到User Action将不会执行
  16.             return new User() { Login = user, Password = pwd };
  17.         }
  18.     }
  19. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

种地

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表