【VS2022+ASP.Net Core+.net6】资源过滤器


【资源过滤器】

本节主要讲解资源过滤器(IResourceFilter、IAsyncResourceFilter)的原理和使用

原理:在html访问项目资源时,需要先访问我们的资源过滤器,方可访问对应的Controller/Action,最后回到资源过滤器中才返回给客户。

1、IResourceFilter

1.1)建资源过滤器类  ResourceCacheFilter 

引用:using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters;

    /// 
    /// 资源过滤器(主要用于资源缓存)
    /// 
    public class ResourceCacheFilter : Attribute, IResourceFilter
    {
        private static Dictionary CacheDictionary = new Dictionary();

        /// 
        /// 资源访问前调用
        /// 
        /// 
        /// 
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            var key = context.HttpContext.Request.Path;
            if (CacheDictionary.ContainsKey(key))
            { 
                context.Result = (IActionResult)CacheDictionary[key];
            }
            Console.WriteLine("资源访问前调用....");
        }

        /// 
        /// 资源访问后调用
        /// 
        /// 
        /// 
        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 CacheDictionary = new Dictionary();

        /// 
        /// 异步访问资源
        /// 
        /// 
        /// 
        /// 
        /// 
        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页面显示情况

大家有问题可以与个人发邮件,收到邮件会第一时间回复大家!

自勉:“锲而不舍,金石可镂