一、使用演示
- 创建
CustomResourceFilter 实现类
using Microsoft.AspNetCore.Mvc.Filters;
namespace StartUp.Filters
{
public class CustomResourceFilter : Attribute, IResourceFilter
{
public void OnResourceExecuting(ResourceExecutingContext context)
{
Console.WriteLine("before");
}
public void OnResourceExecuted(ResourceExecutedContext context)
{
Console.WriteLine("after");
}
}
}
- 在需要过滤的方法上添加注解
[CustomResourceFilter],填写参数名为刚刚创建的类名

- 测试

二、应用场景——缓存
2.1 演示代码
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
namespace StartUp.Filters
{
public class CustomResourceFilter : Attribute, IResourceFilter
{
private static Dictionary<string,object> cache = new Dictionary<string, object>();
public void OnResourceExecuting(ResourceExecutingContext context)
{
string key = context.HttpContext.Request.Path;
if (cache.ContainsKey(key))
{
Console.WriteLine("有缓存了,调用缓存");
context.Result = (IActionResult?)cache[key];
}
}
public void OnResourceExecuted(ResourceExecutedContext context)
{
Console.WriteLine("方法已经执行了,将结果存入缓存");
string key = context.HttpContext.Request.Path;
cache[key] = context.Result;
}
}
}
2.2 测试

三、 异步版本 IAsyncResourceFilter
3.1 演示代码
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
namespace StartUp.Filters
{
public class CustomResourceFilter : Attribute, IAsyncResourceFilter
{
public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
{
await Console.Out.WriteLineAsync("异步方法执行前");
ResourceExecutedContext resourceExecutedContext = await next.Invoke();
await Console.Out.WriteLineAsync("异步方法执行后");
}
}
}

3.2 代码改造
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
namespace StartUp.Filters
{
public class CustomResourceFilter : Attribute, IAsyncResourceFilter
{
private static Dictionary<string, object> cache = new Dictionary<string, object>();
public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
{
string key = context.HttpContext.Request.Path;
if (cache.ContainsKey(key))
{
Console.WriteLine("有缓存了,调用缓存");
context.Result = (IActionResult?)cache[key];
}
else
{
ResourceExecutedContext resourceExecutedContext = await next.Invoke();
Console.WriteLine("方法已经执行了,将结果存入缓存");
cache[key] = context.Result;
}
}
}
}
