netcore - MVC的ActionFilter的使用

经过一周的时间没有分享文章了,主要是在使用.netcore做一个小的项目,项目面向大众用户的增删改查都做的差不多了,打算本周在云服务器上部署试试,很期待,也希望上线后大家多多支持;以上纯属个人废话,来一起看看今天的正篇环节:

.继承IActionFilter来定义个验证登录的流程例子

.ActionFilter中怎么使用依赖注入

下面一步一个脚印的来分享:

.继承IActionFilter来定义个验证登录的流程例子

首先,咋们定义一个名叫FilterTestController的Controller,返回一个JsonResult结果;为了例子查看的方便性,同时在此文件中定义一个名MoResponse的类,对应的代码如下:

 1 public class FilterTestController : Controller
 2     {
 3         public JsonResult Index()
 4         {
 5             var response = new MoResponse();
 6             response.Status = 1;
 7
 8             return Json(response);
 9         }
10     }
11
12     public class MoResponse
13     {
14
15         public int Status { get; set; }
16         public string Des { get; set; } = "Ok";
17     }

然后,执行一下运行命令dotnet run,浏览器中输入默认端口好5000并访问刚才定义的Action,地址如:http://localhost:5000/FilterTes,不出意外大家都能看到如下结果的图样:

这表示项目初建没有问题;

接着,创建一个类,名称为CheckLoginAttribute并且继承和实现Attribute, IActionFilter,这里实现IActionFilter接口的OnActionExecuting,OnActionExecuted两个方法,看方法名称后缀大概就明白一个是Action执行之前,一个是Action方法执行之后调用的,这里简单补充下以前的mvc版本大部分都是去继承ActionFilterAttribute,其实这个也去继承和实现了Attribute, IActionFilter,不过还有其他的扩展罢了,这里不详细区分说明:

然后咋们分别在两个OnActionExecut中增加一些输入信息,并且在FilterTestController的Index方法上方增加[CheckLogin]标记,代码如下:

public class CheckLoginAttribute : Attribute, IActionFilter
    {

        public void OnActionExecuted(ActionExecutedContext context)
        {

            Console.WriteLine(DateTime.Now + "end...");
        }

        public void OnActionExecuting(ActionExecutingContext context)
        {

            Console.WriteLine(DateTime.Now + "start...");

            //context.Result = new RedirectResult("http://www.cnblogs.com/");

        }
    }

再运行起来,访问刚才的路由,可以在命令窗体看到如图:

刚才说的CheckLoginAttribute中的OnActionExecuting对应的是调用Controller的Action方法之前执行的部分,上面代码刚才注释的部分context.Result = new RedirectResult("http://www.cnblogs.com/");是跳转到该http://www.cnblogs.com/地址中去,如果放开注释,看到的效果是访问之前Controller路由后直接跳转到了该地址,并且名利窗体中只有start...日志的部分,没有了之前end...的部分,可以看出这里context.Result效果是直接终止了程序继续往下执行;到这里就可以走一个简单登录的验证了,我这里只说下流程,不做具体代码,因为这不是重点哈哈:

1.在OnActionExecuting方法中使用context.HttpContext.Session获取用户登陆的session(当然其他session保存方式除外)

2.使用context.HttpContext.Request.Path获取当前访问的路由地址

3.如果session为空,使用context.Result = new RedirectResult("/Login?returnUrl=" + context.HttpContext.Request.Path);跳转到路由Login中去,returnUrl参数使用来传递登陆有再跳转到当前访问地址中去

.ActionFilter中怎么使用依赖注入

这个是值得关注的地方,这个在我的项目最初写的时候遇到的问题;下面是一些分析,可供大家参考:

1.netcore常用的注入方式是通过构造函数注入的

2.通过构造函数注入后,在需要使用Filter的Action中无法通过对应参数个数的构造函数调用;只能调用无参的Filter构造函数

3.注意在需要使用依赖注入的Filter中不用定义无参构造函数(这里实验过了,如果定义TypeFilter将会以无参构造函数为优先创建实例,这样将会是依赖注入失败)

以上就是最开始无法直接使用结构器依赖注入的原因,后面无意中发现一个很有用的过滤器:TypeFilterAttribute,该过滤器可以通过构造函数传递进去的对象实例化,下面我们一起来看下:

首先,我们定义个MyActionFilterAttribute类并且继承TypeFilterAttribute,默认继承构造函数,然后在Controller的Index上方使用这个自定义属性并且传递我们定义的CheckLoginAttribute类型为参数,如下代码:

[MyActionFilter(typeof(CheckLoginAttribute))]
        public JsonResult Index()
        {
            var response = new MoResponse();
            response.Status = 1;

            return Json(response);
        }

MyActionFilterAttribute代码如下:

public class MyActionFilterAttribute : TypeFilterAttribute
    {
        public MyActionFilterAttribute(Type type) : base(type)
        {

        }
    }

好了,咋们再自定义个简单的服务,并且把定义的服务在Startup.cs文件中增加代码services.AddTransient<LogService>();注入服务,服务要求是定义个方法,在命令框中输出hello...,如下代码:

 public class LogService
    {

        public async void _LogRequest()
        {

            await Task.Run(() =>
             {

                 for (int i = 0; i < 10; i++)
                 {
                     Console.WriteLine(DateTime.Now + "hello...");
                 }
             });
        }
    }

再来,CheckLoginAttribute中增加代码如:

 1 public class CheckLoginAttribute : Attribute, IActionFilter
 2     {
 3         private readonly LogService _logService;
 4         public CheckLoginAttribute(LogService logService)
 5         {
 6
 7             _logService = logService;
 8         }
 9
10         public void OnActionExecuted(ActionExecutedContext context)
11         {
12
13             Console.WriteLine(DateTime.Now + "end...");
14         }
15
16         public void OnActionExecuting(ActionExecutingContext context)
17         {
18
19             Console.WriteLine(DateTime.Now + "start...");
20
21             var path = context.HttpContext.Request.Path;
22             //context.Result = new RedirectResult($"/Login?returnUrl={path}");
23
24             _logService._LogRequest();
25         }
26     }

好了咋们一起dotnet run看到的效果如:

这个依赖注入到Filter中就成功了,其实上面定义的MyActionFilterAttribute也可以看做多余吧,因为在Action上使用的其实就是TypeFilterAttribute自身的构造函数方法,咋们可以直接在Action上使用TypeFilter如图:

两者效果是一样的,只是定义一个Filter可以记录其他的日志信息或干其他的事情罢了;这次分享的内容就是这样了,不知道描述的是否清晰,希望多多支持,谢谢。

时间: 2024-08-07 04:31:22

netcore - MVC的ActionFilter的使用的相关文章

jwt netcore mvc Api

在此之前,写过一篇 给新手的WebAPI实践 ,获得了很多新人的认可,那时还是基于.net mvc,文档生成还是自己闹洞大开写出来的,经过这两年的时间,netcore的发展已经势不可挡,自己也在不断的学习,公司的项目也转向了netcore.大部分也都是前后分离的架构,后端api开发居多,从中整理了一些东西在这里分享给大家. 源码地址:https://gitee.com/loogn/NetApiStarter,这是一个基于netcore mvc 3.0的模板项目,如果你使用的netcore 2.x

.NetCore MVC中的路由(2)在路由中使用约束

.NetCore MVC中的路由(2)在路由中使用约束 0x00 路由模板中的约束 在配置路由模板时,除了以静态字符和变量的形式外,还可以通过配置对变量进行约束.实际如果不嫌麻烦的话在路由到的Action中对变量进行检查也是一种方法,不过对于变量的通用的约束当然是放在路由层面更加合适.而且这样做会简化Action的代码,使Action更加专注于自身业务,符合AOP的思路.这篇文章主要介绍路由模板中的约束. 0x01 在路由模板中使用约束 在路由模板中使用约束是很简单的,如下所示: {contro

.netcore mvc docker环境jenkins一键部署(DevOps)

[前言] DevOps方面的文章很早之前就想分享了,挤出一点时间把前段时间搭建的一些提高开发效率的东西给大家分享一下吧. 本文介绍了一个.netcore mvc web项目,从项目push到github开始 自动从github上拉取代码 编译,生成,发布 停止docker容器,删除docker镜像 通过项目的dockerfile新建docker镜像 Run容器,自动绑定ip,站点启动 整个过程只需要在jenkins这个自动化工具上点一个按钮.下面我们按顺序来简单介绍一下. 使用的内容都很基础,重

netcore mvc菜单,角色,权限

AntMgr https://github.com/yuzd/AntMgr 基于netcore2.0 mvc 开发的 快速搭建具有如下特色的后台管理系统 特色: 用户管理 菜单管理 角色管理 权限管理[精确到按钮]) 代码生成器 如何使用 代码克隆到本地 用vs2017或以上版本 打开工程. 项目结构如下: 找到DbModel下面的初始化db脚本 里面包含4张表的schema和初始化数据,你可以新建一个db,也可以导入到你现有的db system_users 系统用户表 system_menu

.netCore MVC 更新时文件被锁定的解决办法

使用.netCore更新部署在IIS上的WEB应用时发现文件被锁定了不能像以前非core的那样直接覆盖了,以下就是解决这一问题我使用的方法. 也可以参考微软官方的文档 https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/iis/?view=aspnetcore-2.0&tabs=aspnetcore2x 方法有几种: 最简单的就是把网站停止了再更新. 由于我懒得每次这样关感觉也不太方便写了个脚本(依据官方提供的第一种方式) 1

.NetCore -MVC 路由的配置

using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection;

.netCore MVC View 如何不使用模板

默认情况下, 新建的View都是默认加载模板 _Laytou.cshtml 文件的,这是因为在 _ViewStart.cshtml 中定义了. 如果不需要加载模板文件,有两种方法 1. 在单独的View文件中,定义 Layout 属性为 null 2. 在 Control 文件中,返回View对象时,设置为 PartialView. 原文地址:https://www.cnblogs.com/googlegis/p/12217590.html

朱晔和你聊Spring系列S1E4:灵活但不算好用的Spring MVC

阅读PDF版本 本文会以一些例子来展现Spring MVC的常见功能和一些扩展点,然后我们来讨论一下Spring MVC好用不好用. 使用SpringBoot快速开始 基于之前的parent模块,我们来创建一个新的模块: <?xml version="1.0" encoding="UTF-8"?> <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xml

FreeSql 新的八大骚功能,.NETCore 你必须晓得的 ORM

前言 FreeSql 目前版本号 0.5.5,预计明年元旦发布 1.0.0,切莫小看了版本号,目前单元测试方法1350+,并且每个方法内的涵盖面又比较广(不信的话见下图),每一次版本发布都作了较多的测试工作. 最近的一段时间,关注我们的人时不时会看见扩展包发布,今天振奋人心的功能主要是核心部分实现(扩展包今天当配角).就不多啰嗦了,咱们直接入主题. 功能一:MapType 类型映射 使用 codefirst 时序列化 json 或 jsonb 数据类型报错 使用 postgresql + ef