码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • .Net Core Aop之IResourceFilter


    一、简介

    在.net core 中Filter分为以下六大类:

    1、AuthorizeAttribute(权限验证)

    2、IResourceFilter(资源缓存)

    3、IActionFilter(执行方法前后的记录)

    4、IResultFilter(结果生成前后扩展)

    5、IAlwaysRun(响应结果的补充)

    6、IExceptionFilter(异常处理)

    二、IResourceFilter(同步资源缓存)

    1、定义Filter

    复制代码
    public class CustomerResourceFilterAttribute : Attribute, IResourceFilter
        {
            private static Dictionary<string,object> cacheDic=new Dictionary<string, object>();
            public void OnResourceExecuting(ResourceExecutingContext context)
            {
                var path=context.HttpContext.Request.Path; 
                if (cacheDic.ContainsKey(path))
                {
                    context.Result = (IActionResult)cacheDic[path];
                }
                Console.WriteLine("CustomerResourceFilterAttribute.OnResourceExecuting");
            }
            public void OnResourceExecuted(ResourceExecutedContext context)
            {
                var path = context.HttpContext.Request.Path;
                cacheDic[path] = context.Result;
                Console.WriteLine("CustomerResourceFilterAttribute.OnResourceExecuted");
            }
    
            
        }
    复制代码

    2、使用Filter

    复制代码
    public class HomeController : Controller
        {
            private readonly ILogger<HomeController> _logger;
    
            public HomeController(ILogger<HomeController> logger)
            {
                _logger = logger;
                Console.WriteLine($"执行 {this.GetType().Name} 构造函数");
            }
    
            [CustomerResourceFilter]
            public IActionResult Index()
            {
                ViewBag.Data = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                return View();
            }
        }
    复制代码

    3、前端页面代码

    复制代码
    @{
        ViewData["Title"] = "Home Page";
    }
    
    
    <h3>来自于控制器的结果:@ViewBag.Data</h3>
    <h3>来自于页面的结果:@DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")</h3>
    复制代码

    4、页面效果

    按F5可以看到页面值的变化效果,"来自于控制器的结果"的值会一直不变,“来自于页面的结果”随着页面刷新,值会一直变化

     

    三、IAsyncResourceFilter(异步资源缓存)

     

    复制代码
    public class CustomerAsyncResourceFilterAttribute : Attribute, IAsyncResourceFilter
        {
            private static Dictionary<string, object> cacheDic = new Dictionary<string, object>();
            public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
            {
                Console.WriteLine("CustomerResourceFilterAttribute.OnResourceExecutionAsync Before");
    
                var path = context.HttpContext.Request.Path;
                if (cacheDic.ContainsKey(path))
                {
                    context.Result = (IActionResult)cacheDic[path];
                }
                else
                {
                    ResourceExecutedContext resource =await next.Invoke();
                    cacheDic[path] = resource.Result; // 这句话的执行就是去执行控制器的构造函数+Action
                    Console.WriteLine("CustomerResourceFilterAttribute.OnResourceExecutionAsync After");
                }
                
    
            }
        }
    复制代码

     

    四、总结

    不管是同步还是异步,他们的执行顺序其实都是一样的,下面是同步和异步分别打印的日志记录:

    1、同步日志

    2、异步日志

     

  • 相关阅读:
    计算机网络-数据链路层
    [element-ui] 对el-tree的某个节点进行禁用
    数据权限-字段权限【实践篇-结合相关业务详细讲解如何实现】(基于若依框架)
    大数据必学Java基础(五十五):泛型深入了解
    Servlet学习笔记
    如何设计一个短地址服务
    The 2021 ICPC Asia Nanjing Regional Contest H. Crystalfly
    C++:栈与队列,优先级队列
    Ubuntu 环境配置 Minecraft 基岩版服务器
    【机器学习】使用scikitLearn对数据进行降维处理:PCA法及增量训练
  • 原文地址:https://www.cnblogs.com/sportsky/p/15915959.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号