目录
一:说明
IResourceFilter同步过滤器与IAsyncResourceFilter异步过滤器常常被用作于缓存。
IResourctFilter同步过滤器执行顺序:
1:执行ResourceFilter.OnResourceExecuting方法
2:执行控制器中的构造函数,实例化控制器
3:执行具体的Action方法
4:执行ResourceFilter.OnResourceExecuted方法
IAsyncResourceFilter异步过滤器执行顺序:
1:在XXX请求之前调用AsyncResourceFilter.OnResourceExecutionAsync方法
2:判断数据是否被缓存,如果被缓存,将继续执行。如果没有被缓存,将数据进行缓存再继续执行。
二:IResourceFilter同步
控制器代码:
/// <summary>
/// Get请求
/// 应用ResourceFilter扩展
/// Home控制器的Index
/// </summary>
/// <returns>Index视图</returns>
[HttpGet]
[ResourceFilter]
public IActionResult Index()
{
ViewBag.DateTime = DateTime.Now.ToString("HH:mm:ss");
return View();
}
视图代码:
@{
ViewBag.Title = "首页";
Layout = "~/Views/Shared/_Layout.cshtml";
}
@model string;
<h1>当前是Home/Index页</h1>
<h2>来自于控制器的计算结果:@ViewBag.DateTime</h2>
<h2>来自于视图中的计算结果:@DateTime.Now.ToString("HH:mm:ss")</h2>
关键类ResourceFilter代码:
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
namespace Study_ASP.NET_Core_MVC.Filters
{
public class ResourceFilter : Attribute, IResourceFilter
{
/// <summary>
/// 初始化构造函数
/// </summary>
private static Dictionary<string, object> CacheDictionary = new Dictionary<string, object>();
/// <summary>
/// 在XXX执行之前
/// </summary>
/// <param name="context"></param>
/// <exception cref="NotImplementedException"></exception>
public void OnResourceExecuting(ResourceExecutingContext context)
{
//定义请求路径
string pathKey = context.HttpContext.Request.Path;
//判断请求路径是否被缓存
if (CacheDictionary.ContainsKey(pathKey))
{
//只要给Result赋值了,就会中断执行,直接返回调用方法
context.Result = (IActionResult)CacheDictionary[pathKey];
}
Console.WriteLine("在XXX执行之前CustomCacheResourceFilterAttribute.OnResourceExecuting方法");
}
/// <summary>
/// 在XXX执行之后
/// </summary>
/// <param name="context"></param>
/// <exception cref="NotImplementedException"></exception>
public void OnResourceExecuted(ResourceExecutedContext context)
{
//定义请求路径
string pathKey = context.HttpContext.Request.Path;
//将缓存保存在构造函数
CacheDictionary[pathKey] = context.Result;
Console.WriteLine("在XXX执行之后CustomCacheResourceFilterAttribute.OnResourceExecuted方法");
}
}
}
效果截图:
三:IAsyncResourceFilter异步
控制器代码:
/// <summary>
/// Get请求
/// 应用ResourceAsyncFilter扩展
/// Home控制器的Index
/// </summary>
/// <returns>Index视图</returns>
[HttpGet]
[ResourceAsyncFilter]
public IActionResult Index()
{
ViewBag.DateTime = DateTime.Now.ToString("HH:mm:ss");
return View();
}
视图代码:
@{
ViewBag.Title = "首页";
Layout = "~/Views/Shared/_Layout.cshtml";
}
@model string;
<h1>当前是Home/Index页</h1>
<h2>来自于控制器的计算结果:@ViewBag.DateTime</h2>
<h2>来自于视图中的计算结果:@DateTime.Now.ToString("HH:mm:ss")</h2>
关键类ResourceAsyncFilter代码:
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
namespace Study_ASP.NET_Core_MVC.Filters
{
public class ResourceAsyncFilter : Attribute, IAsyncResourceFilter
{
/// <summary>
/// 初始化构造函数
/// </summary>
private static Dictionary<string, object> CacheDictionary = new Dictionary<string, object>();
/// <summary>
/// 在XXX执行时
/// </summary>
/// <param name="context"></param>
/// <param name="next"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
{
Console.WriteLine("在XXX执行之前CustomCacheAsyncResourceFilterAttribute.OnResourceExecutionAsync方法");
//定义请求路径
string pathKey = context.HttpContext.Request.Path;
//判断请求路径是否被缓存
if (CacheDictionary.ContainsKey(pathKey))
{
//只要给Result赋值了,就会中断执行,直接返回调用方法
context.Result = (IActionResult)CacheDictionary[pathKey];
}
else
{
//执行控制器的构造函数和Action控制器方法
ResourceExecutedContext resource = await next.Invoke();
//将缓存保存在构造函数
CacheDictionary[pathKey] = resource.Result;
Console.WriteLine("在XXX执行之后CustomCacheAsyncResourceFilterAttribute.OnResourceExecutionAsync方法");
}
}
}
}
效果截图: