于承承 发表于 2023-7-9 02:34:23

.Net Core ResourceFilter


目录

[*]作用
[*]实现

[*]IAsyncResourceFilter
[*]IAsyncResourceFilter

[*]全局注册
[*]如何取body参数
[*]Aop缓存简单示例

[*]过滤器代码
[*]Action代码


作用



[*]在请求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
全局注册

builder.Services.AddControllersWithViews(
    options =>
    {
      //这样注册将对所有action 都生效
      options.Filters.Add<CustomAsyncResourceFilterAttribute>();
    }).AddControllersAsServices();如何取body参数

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

过滤器代码

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

namespace Cnpc.Com.Ioc.WebApp.Filter
{
    public class CustomAsyncResourceFilterAttribute : Attribute, IAsyncResourceFilter
    {
      private static Dictionary<string, IActionResult?> cache = new Dictionary<string, IActionResult?>();
      public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
      {
            {
                Console.WriteLine("方法前 Async");
                string user_id = context.HttpContext.Request.Query["User"];
                if (cache.ContainsKey(user_id))
                {
                  context.Result = cache;
                }
                else
                {
                  ResourceExecutedContext exected = await next();
                  {
                        Console.WriteLine("方法后 Async");
                        cache = exected.Result;
                  }
                }
            }

      }
    }
}Action代码

using Cnpc.Com.Ioc.WebApp.Filter;
using Microsoft.AspNetCore.Mvc;

namespace Cnpc.Com.Ioc.WebApp.Controllers
{
    /")]
   
    public class TestFilterController : ControllerBase
    {
      
      
      public async Task<ActionResult<User?>> LoginIn(string user, string pwd)
      {
            Console.WriteLine("LoginIn");
            await Task.CompletedTask;
            Thread.Sleep(3000);//测试缓存是否生效,第一次会等3秒, 下一次找到User Action将不会执行
            return new User() { Login = user, Password = pwd };
      }
    }
}
来源:https://www.cnblogs.com/qfccc/archive/2023/07/09/17538231.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: .Net Core ResourceFilter