.Net Core ResourceFilter
1..Net Core ActionFilter
2..Net Core ResourceFilter
3..Net Core Jwt鉴权授权4..Net Core Mvc Razor 组件5..Net Core Autofac6..Net Core ActionFilter7..Net Core ExceptionFilter8..Net Core AlwaysRunResultFilter9..Net Core EntityFrameCore10..Net Core 读取配置文件11..Net Core NLog+oracel12..Net Core MiddleWare13..Net Core WebApi14..Net Core gRpc调用作用
- 在请求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[user_id];
}
else
{
ResourceExecutedContext exected = await next();
{
Console.WriteLine("方法后 Async");
cache[user_id] = exected.Result;
}
}
}
}
}
}
Action代码
using Cnpc.Com.Ioc.WebApp.Filter;
using Microsoft.AspNetCore.Mvc;
namespace Cnpc.Com.Ioc.WebApp.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class TestFilterController : ControllerBase
{
[CustomAsyncResourceFilter]
[HttpPost]
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 };
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?