首页 > 其他分享 >.Net Core Aop之IActionFilter

.Net Core Aop之IActionFilter

时间:2023-11-03 16:15:42浏览次数:26  
标签:Core IActionFilter ILogger public context var CustomerActionFilterAttribute Net 

一、简介

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

1、AuthorizeAttribute(权限验证)

2、IResourceFilter(资源缓存)

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

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

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

6、IExceptionFilter(异常处理)

 二、IActionFilter(同步)

1、定义Filter

复制代码
public class CustomerActionFilterAttribute : Attribute, IActionFilter
    {
        /// <summary>
        /// 在XXAction执行之前
        /// </summary>
        /// <param name="context"></param>
        public void OnActionExecuting(ActionExecutingContext context)
        {
            Console.WriteLine("CustomerActionFilterAttribute.OnActionExecuting");
        }

        /// <summary>
        /// 在XXAction执行之后
        /// </summary>
        /// <param name="context"></param>
        public void OnActionExecuted(ActionExecutedContext context)
        {
            Console.WriteLine("CustomerActionFilterAttribute.OnActionExecuted");
        }

        
    }
复制代码

 

2、使用Filter

复制代码
public class Home1Controller : Controller
    {
        private readonly ILogger<HomeController> _logger;

        public Home1Controller(ILogger<HomeController> logger)
        {
            _logger = logger;
            Console.WriteLine($"执行 {this.GetType().Name} 构造函数");
        }


        [CustomerActionFilter]
        public IActionResult Index()
        {
            Console.WriteLine($"执行 Index 方法");
            return View();
        }
    }
复制代码

 3、扩展记录日志

复制代码
public class CustomerActionFilterAttribute : Attribute, IActionFilter
    {

        private readonly ILogger<CustomerActionFilterAttribute> _logger;

        public CustomerActionFilterAttribute(ILogger<CustomerActionFilterAttribute> logger)
        {
            _logger = logger;
        }
        /// <summary>
        /// 在XXAction执行之前
        /// </summary>
        /// <param name="context"></param>
        public void OnActionExecuting(ActionExecutingContext context)
        {
            var para = context.HttpContext.Request.QueryString.Value;
            var controllerName = context.ActionDescriptor.RouteValues["controller"];
            var actionName = context.ActionDescriptor.RouteValues["action"];

            _logger.LogInformation($"当前请求的控制器是{controllerName},方法名{actionName},请求参数是{JsonConvert.SerializeObject(para)}");

        }

        /// <summary>
        /// 在XXAction执行之后
        /// </summary>
        /// <param name="context"></param>
        public void OnActionExecuted(ActionExecutedContext context)
        {
            var para = context.Result;
            var controllerName = context.ActionDescriptor.RouteValues["controller"];
            var actionName = context.ActionDescriptor.RouteValues["action"];
            _logger.LogInformation($"当前请求的控制器是{controllerName},方法名{actionName},请求结果是{JsonConvert.SerializeObject(para)}");

        }
    }
复制代码 复制代码
public class Home1Controller : Controller
    {
        private readonly ILogger<HomeController> _logger;

        public Home1Controller(ILogger<HomeController> logger)
        {
            _logger = logger;
            Console.WriteLine($"执行 {this.GetType().Name} 构造函数");
        }


        [TypeFilter(typeof(CustomerActionFilterAttribute))]
        public IActionResult Index(int id)
        {
            Console.WriteLine($"执行 Index 方法");
            ViewBag.Data = new { name = "11111" };
            return View();
        }
    }
复制代码

  

 

 三、IAsyncActionFilter(异步)

复制代码
public class CustomerAsyncActionFilterAttribute : Attribute, IAsyncActionFilter
    {

        private readonly ILogger<CustomerAsyncActionFilterAttribute> _logger;

        public CustomerAsyncActionFilterAttribute(ILogger<CustomerAsyncActionFilterAttribute> logger)
        {
            _logger = logger;
        }
        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {

            var para = context.HttpContext.Request.QueryString.Value;
            var controllerName = context.ActionDescriptor.RouteValues["controller"];
            var actionName = context.ActionDescriptor.RouteValues["action"];

            _logger.LogInformation($"当前请求的控制器是{controllerName},方法名{actionName},请求参数是{JsonConvert.SerializeObject(para)}");
            
            var excuteContext = await next.Invoke(); // 这句话就是去执行Action

            _logger.LogInformation($"当前请求的控制器是{controllerName},方法名{actionName},请求结果是{JsonConvert.SerializeObject(excuteContext.Result)}");

        }
    }
复制代码 复制代码
public class Home1Controller : Controller
    {
        private readonly ILogger<HomeController> _logger;

        public Home1Controller(ILogger<HomeController> logger)
        {
            _logger = logger;
            Console.WriteLine($"执行 {this.GetType().Name} 构造函数");
        }


        //[TypeFilter(typeof(CustomerActionFilterAttribute))]
        [TypeFilter(typeof(CustomerAsyncActionFilterAttribute))]
        public IActionResult Index(int id)
        {
            Console.WriteLine($"执行 Index 方法");
            ViewBag.Data = new { name = "11111" };
            return View();
        }
    }
复制代码

 

 

 

四、总结

作用:该Filter可以记录Action执行前后的参数和结果

 

执行顺序:
1、执行控制器的构造函数
2、执行CustomerActionFilterAttribute.OnActionExecuting
3、执行Action方法
4、执行CustomerActionFilterAttribute.OnActionExecuted

 

 来自:https://www.cnblogs.com/sportsky/p/15920763.html

标签:Core,IActionFilter,ILogger,public,context,var,CustomerActionFilterAttribute,Net,
From: https://www.cnblogs.com/djd66/p/17807780.html

相关文章

  • Distilling Knowledge from Graph Convolutional Networks
    目录概符号说明DistillGCNLocalStructurePreserving代码YangY.,QiuJ.,SongM.,TaoD.andWangX.Distillingknowledgefromgraphconvolutionalnetworks.CVPR,2020.概蒸馏表征间的结构关系,教师必须是图网络结构?符号说明\(\mathcal{G}=(\mathcal{V},\m......
  • .Net Core Aop之IResourceFilter
    一、简介在.netcore中Filter分为以下六大类:1、AuthorizeAttribute(权限验证)2、IResourceFilter(资源缓存)3、IActionFilter(执行方法前后的记录)4、IResultFilter(结果生成前后扩展)5、IAlwaysRun(响应结果的补充)6、IExceptionFilter(异常处理)二、IResourceFilter(同步资源缓存)1......
  • .Net Core AOP之IResultFilter
    一、简介在.netcore中Filter分为以下六大类:1、AuthorizeAttribute(权限验证)2、IResourceFilter(资源缓存)3、IActionFilter(执行方法前后的记录)4、IResultFilter(结果生成前后扩展)5、IAlwaysRun(响应结果的补充)6、IExceptionFilter(异常处理)二、IResultFilter(同步)1、定义Filt......
  • .Net Core AOP之IExceptionFilter
    一、简介在.netcore中Filter分为以下六大类:1、AuthorizeAttribute(权限验证)2、IResourceFilter(资源缓存)3、IActionFilter(执行方法前后的记录)4、IResultFilter(结果生成前后扩展)5、IAlwaysRun(响应结果的补充)6、IExceptionFilter(异常处理)二、使用publicclassCustomerE......
  • Musescore常用操作备忘
    最近开始写歌,记录下经常用的一些操作目录添加文本折叠休止符添加小节删除小节添加乐器编辑双音、和弦钢琴键盘升高/降低音三连音多声部延音线连音线添加文本选中音符,按cmd+T折叠休止符折叠休止符,按下键盘上的M添加小节选择小节,右键->插入小节插入换行小节也可以插入水......
  • C#.NET 国密SM4 CBC 对称加解密 与JAVA互通 ver:20231103
    C#.NET国密SM4CBC对称加解密与JAVA互通ver:20231103 .NET环境:.NET6控制台程序(.netcore)。JAVA环境:JAVA8,带maven的JAVA控制台程序。 简要解析:1:加密的KEY、明文等输入参数都需要string转byte[],要约定好编码,如:UTF8。2:加密后的输出参数:byte[],在传输时需要转......
  • 如何让 WinDebug Preview 加载 Dotnet Core 的 SOS.dll 进行调试
    一、前言最近我在使用WinDebug进行系统调试,也是在学习《Net高级调试》这本书。以前听过WinDebug调试器,但是没有使用过,由于最近想起来了,就好好的研究一下,学习一下。初次接触,还是走了不少弯路,踩了不少坑。关于WinDebug最新版的安装方法,可以在“微软商店”里面,直接查询......
  • 如何为Windows服务增加Log4net和EventLog的日志功能
    一、简介最近在做一个项目的时候,需要该项目自动启动、自动运行,不需要认为干预。不用说,大家都知道用什么技术,那就是Windows服务。在以前的NetFramework平台下,Windows服务是一个不错的选择。如果现在在NetCore版本,或者Net5.0以及以上版本,我们会有另外一个选择,这就是......
  • ASP.NET Web Optimization Framework
    ASP.NETWebOptimizationFrameworkWecanusepatternswhilesearchingfilesorsubdirectoriesbyusing“*”wildcardcharacterasfollows:Include(“~/Scripts/Common/*.js”)===>thiswillincludealljsfiles.IncludeDirectory(“~/Scripts/Common”,”T*.js......
  • Net 高级调试--系列文章
    合集-Net高级调试Net高级调试之一:开始认识一些调试工具 Net高级调试之二:CLR和Windows加载器及应用程序域介绍 Net高级调试之三:类型元数据介绍(同步块表、类型句柄、方法描述符等) Net高级调试之四:Windbg动态调试 Net高级调试之五:如何在托管函数上设置断点   ......