.Net Core Aop之IResourceFilter的具体使用

目录
  • 一、简介
  • 二、IResourceFilter(同步资源缓存)
    • 1、定义Filter
  • 三、IAsyncResourceFilter(异步资源缓存)
  • 四、总结

一、简介

在.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、异步日志

到此这篇关于.Net Core Aop之IResourceFilter的具体使用的文章就介绍到这了,更多相关.Net Core Aop IResourceFilter内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 解析.netcore项目中IStartupFilter使用教程

    背景: netcore项目中有些服务是在通过中间件来通信的,比如orleans组件.它里面服务和客户端会指定网关和端口,我们只需要开放客户端给外界,服务端关闭端口.相当于去掉host,这样省掉了些指定配置连接和端口,用起来非常方便. 干掉host,下面代码: using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection;

  • asp.net core MVC 过滤器之ActionFilter过滤器(2)

    本系类将会讲解asp.net core MVC中的内置过滤器的使用,将分为以下章节 asp.net core MVC 过滤器之ExceptionFilter过滤器(一) asp.net core MVC 过滤器之ActionFilter过滤器(二) asp.net core MVC 过滤器之ResultFilter过滤器(三) asp.net core MVC 过滤器之ResourceFilter过滤器(四) asp.net core MVC 过滤器之AuthorizationFilter过滤器

  • asp.net core MVC 全局过滤器之ExceptionFilter过滤器(1)

    本系类将会讲解asp.net core MVC中的内置全局过滤器的使用,将分为以下章节 asp.net core MVC 过滤器之ExceptionFilter过滤器(一) asp.net core MVC 过滤器之ActionFilter过滤器(二) asp.net core MVC 过滤器之ResultFilter过滤器(三) asp.net core MVC 过滤器之ResourceFilter过滤器(四) asp.net core MVC 过滤器之AuthorizationFilter过

  • 详解.Net Core 权限验证与授权(AuthorizeFilter、ActionFilterAttribute)

    在.Net Core 中使用AuthorizeFilter或者ActionFilterAttribute来实现登录权限验证和授权 一.AuthorizeFilter 新建授权类AllowAnonymous继承AuthorizeFilter,IAllowAnonymousFilter public class AllowAnonymous : AuthorizeFilter, IAllowAnonymousFilter { } 新建拦截类继承AuthorizeFilter public class

  • ASP.NET Core MVC 过滤器(Filter)

    目录 一.过滤器如何工作 1.选择过滤器 2.实现过滤器 3.过滤器作用域 4.取消和短路 二.配置过滤器 1.依赖注入 2.排序 3.对比中间件 一.过滤器如何工作 不同的过滤器类型在管道中的不同阶段执行,因此具有各自的与其场景.根据需要执行的任务以及需要执行的请求管道中的位置,选择要创建的过滤器类型.过滤器在 MVC 操作调用管道中运行,有时也称为过滤管道,在 MVC 中选择要执行的操作后,执行操作上的过滤器,如图: 不同的过滤器在管道内的不同位置执行.像授权过滤器这样的过滤器只在管道中靠前

  • .Net Core中使用ExceptionFilter过滤器的方法

    .Net Core中有各种Filter,分别是AuthorizationFilter.ResourceFilter.ExceptionFilter.ActionFilter.ResultFilter.可以把他们看作是.Net Core自带的AOP的扩展封装. 今天来看其中的一种:ExceptionFilter(用于全局的异常处理) 首先新建一个.Net Core MVC的项目 新建一个控制器: 这里我们可以看到代码运行到16行时会报一个索引项超出集合范围的错误 按照常规的思维我们在代码中会加异常

  • .Net Core Aop之IResourceFilter的具体使用

    目录 一.简介 二.IResourceFilter(同步资源缓存) 1.定义Filter 三.IAsyncResourceFilter(异步资源缓存) 四.总结 一.简介 在.net core 中Filter分为以下六大类: 1.AuthorizeAttribute(权限验证) 2.IResourceFilter(资源缓存) 3.IActionFilter(执行方法前后的记录) 4.IResultFilter(结果生成前后扩展) 5.IAlwaysRun(响应结果的补充) 6.IExceptio

  • JAVA实现通用日志记录方法

    前言: 之前想在filter层直接过滤httpServerletRequest请求进行日志处理,但是之后再getWriter()的 时候报already been call异常.查了下,才发现原来流形式的只能读取一次..就好像食物,吃了就没了.. 所以在filter和inteceptor里面是没法通过获取request的流来进行日志记录的. 于是还是准备用通用的方法:controller层aop进行切面记录日志. 使用Aop记录操作日志 第一步:添加Aop /** * 统一日志处理Handler

  • Asp.Net Core轻量级Aop解决方案:AspectCore

    什么是AspectCore Project ? AspectCore Project 是适用于Asp.Net Core 平台的轻量级 Aop(Aspect-oriented programming) 解决方案,它更好的遵循Asp.Net Core的模块化开发理念,使用AspectCore可以更容易构建低耦合.易扩展的Web应用程序.AspectCore使用Emit实现高效的动态代理从而不依赖任何第三方Aop库. 开使使用AspectCore 启动 Visual Studio.从 File 菜单,

  • .NET Core类库System.Reflection.DispatchProxy实现简易Aop的方法

    前言 aop即是面向切面编程,众多Aop框架里Castle是最为人所知的,另外还有死去的Spring.NET,当然,.NET Core社区新秀AspectCore在性能与功能上都非常优秀,已经逐渐被社区推崇和有越来越多的人使用.感谢柠檬同学的礼物! 如果大家出于自身需求或者学习,想实现一个Aop,是不是觉得一来就要使用Emit去做?最近我了解到了System.Reflection.DispatchProxy这个corefx类库,已经实现了动态代理功能. 1|1System.Reflection.

  • Asp.net Core 3.1基于AspectCore实现AOP实现事务、缓存拦截器功能

    最近想给我的框架加一种功能,就是比如给一个方法加一个事务的特性Attribute,那这个方法就会启用事务处理.给一个方法加一个缓存特性,那这个方法就会进行缓存. 这个也是网上说的面向切面编程AOP. AOP的概念也很好理解,跟中间件差不多,说白了,就是我可以任意地在方法的前面或后面添加代码,这很适合用于缓存.日志等处理. 在net core2.2时,我当时就尝试过用autofac实现aop,但这次我不想用autofac,我用了一个更轻量级的框架,AspectCore. 用起来非常非常的简单,但一

  • .NET Core利用动态代理实现AOP(面向切面编程)

    目录 1.介绍 1.1 动态代理作用 1.2 原生DispatchProxy类介绍 1.3简单介绍一下:IL代码 2.实现 2.1 继承DispatchProxy 2.2 定义handle接口 2.3 定义AOP特性 2.4 定义创建代理类的工厂 2.5 定义ServiceHelp 3.测试 3.1 定义handle实现 3.2 定义Service接口 3.3实现Service接口 3.4 大功告成 3.5 效果 4.Demo 1.介绍 1.1 动态代理作用 用动态代理可以做AOP(面向切面编程

  • .NET Core使用Autofac容器的DI依赖注入,IOC控制反转及AOP切面编程

    目录 Autofac 容器 Autofac 多种注入方式 Autofac 生命周期 Autofac 支持配置文件 Autofac 整合 .NET 5 MVC Autofac 支持控制器属性注入 Autofac 单实例多实现 Autofac 支持 AOP Autofac 容器 Autofac 是一款.NET IoC 容器 . 它管理类之间的依赖关系, 从而使 应用在规模及复杂性增长的情况下依然可以轻易地修改 . 它的实现方式是将常规的.net类当做组件处理. 安装 NuGet 程序包: Autof

  • .NET Core基于EMIT编写的轻量级AOP框架CZGL.AOP

    目录 1,快速入门 1.1继承ActionAttribute特性 1.2标记代理类型 2,如何创建代理类型 通过API直接创建 2,创建代理类型 通过API 通过Microsoft.Extensions.DependencyInjection 通过Autofac 3,深入使用 代理类型 方法.属性代理 上下文 拦截方法或属性的参数 非侵入式代理 Nuget 库地址:https://www.nuget.org/packages/CZGL.AOP/ Github 库地址:https://github

  • 浅谈ASP.NET Core 中间件详解及项目实战

    前言 本篇文章是我们在开发自己的项目中实际使用的,比较贴合实际应用,算是对中间件的一个深入使用了,不是简单的Hello World. 中间件(Middleware)的作用 我们知道,任何的一个web框架都是把http请求封装成一个管道,每一次的请求都是经过管道的一系列操作,最终到达我们写的代码中.那么中间件就是在应用程序管道中的一个组件,用来拦截请求过程进行一些其他处理和响应.中间件可以有很多个,每一个中间件都可以对管道中的请求进行拦截,它可以决定是否将请求转移给下一个中间件. asp.net

  • 利用C#实现AOP常见的几种方法详解

    前言 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的中统一处理业务逻辑的一种技术,比较常见的场景是:日志记录,错误捕获.性能监控等 AOP的本质是通过代理对象来间接执行真实对象,在代理类中往往会添加装饰一些额外的业务代码,比如如下代码: class RealA { public virtual string Pro { get; set; } public virtual void ShowHello(str

随机推荐