【VS2022+ASP.Net Core+.net6】资源过滤器
【资源过滤器】
本节主要讲解资源过滤器(IResourceFilter、IAsyncResourceFilter)的原理和使用
原理:在html访问项目资源时,需要先访问我们的资源过滤器,方可访问对应的Controller/Action,最后回到资源过滤器中才返回给客户。

1、IResourceFilter
1.1)建资源过滤器类 ResourceCacheFilter
引用:using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters;
/// <summary>
/// 资源过滤器(主要用于资源缓存)
/// </summary>
public class ResourceCacheFilter : Attribute, IResourceFilter
{
private static Dictionary<string, object> CacheDictionary = new Dictionary<string, object>();
/// <summary>
/// 资源访问前调用
/// </summary>
/// <param name="context"></param>
/// <exception cref="NotImplementedException"></exception>
public void OnResourceExecuting(ResourceExecutingContext context)
{
var key = context.HttpContext.Request.Path;
if (CacheDictionary.ContainsKey(key))
{
context.Result = (IActionResult)CacheDictionary[key];
}
Console.WriteLine("资源访问前调用....");
}
/// <summary>
/// 资源访问后调用
/// </summary>
/// <param name="context"></param>
/// <exception cref="NotImplementedException"></exception>
public void OnResourceExecuted(ResourceExecutedContext context)
{
CacheDictionary[context.HttpContext.Request.Path] = context.Result;
Console.WriteLine("资源访问后调用....");
}
}
1.2)对应的项目资源添加属性
[ResourceCacheFilter]
[ResourceCacheFilter]
public IActionResult TestResourceFilter()
{
ViewBag.Date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
return View();
}
1.3)View页面显示情况

2、IAsyncResourceFilter
2.1)建资源过滤器类 ResourceAsyncCacheFilter
引用:using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters;
public class ResourceAsyncCacheFilter : Attribute, IAsyncResourceFilter
{
private static Dictionary<string, object> CacheDictionary = new Dictionary<string, object>();
/// <summary>
/// 异步访问资源
/// </summary>
/// <param name="context"></param>
/// <param name="next"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
{
var key = context.HttpContext.Request.Path;
Console.WriteLine("资源异步前访问....");
if (CacheDictionary.ContainsKey(key))
{
context.Result = (IActionResult)CacheDictionary[key];
}
else
{
ResourceExecutedContext source = await next.Invoke();
CacheDictionary[key] = source.Result;
}
Console.WriteLine("资源异步后访问....");
}
}
2.2)对应的项目资源添加属性[ResourceAsyncCacheFilter]
[ResourceAsyncCacheFilter]
public IActionResult TestResourceFilter()
{
ViewBag.Date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
return View();
}
2.3)View页面显示情况

大家有问题可以与个人发邮件,收到邮件会第一时间回复大家!
自勉:“锲而不舍,金石可镂”

浙公网安备 33010602011771号