ToB企服应用市场:ToB评测及商务社交产业平台
标题:
.Net Core ResourceFilter
[打印本页]
作者:
种地
时间:
2023-7-9 04:36
标题:
.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[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 };
}
}
}
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4