[toc] # 作用 - 在請求Authorize Filter後執行, 可以做緩存處理 - ResourceFilter 在控制器實例化之前執行 - ResourceFilter 可以在全局, Controller, Action 都可以設置, 並且都會執行(一個ResourceFilter可以重 ...
目錄
作用
- 在請求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 };
}
}
}