netcore - MVC的ActionFilter的使用
经过一周的时间没有分享文章了,主要是在使用.netcore做一个小的项目,项目面向大众用户的增删改查都做的差不多了,打算本周在云服务器上部署试试,很期待,也希望上线后大家多多支持;以上纯属个人废话,来一起看看今天的正篇环节:
.继承IActionFilter来定义个验证登录的流程例子
.ActionFilter中怎么使用依赖注入
下面一步一个脚印的来分享:
.继承IActionFilter来定义个验证登录的流程例子
首先,咋们定义一个名叫FilterTestController的Controller,返回一个JsonResult结果;为了例子查看的方便性,同时在此文件中定义一个名MoResponse的类,对应的代码如下:
public class FilterTestController : Controller
{
public JsonResult Index()
{
var response = new MoResponse();
response.Status = ; return Json(response);
}
} public class MoResponse
{ public int Status { get; set; }
public string Des { get; set; } = "Ok";
}
然后,执行一下运行命令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 = ; 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 = ; i < ; i++)
{
Console.WriteLine(DateTime.Now + "hello...");
}
});
}
}
再来,CheckLoginAttribute中增加代码如:
public class CheckLoginAttribute : Attribute, IActionFilter
{
private readonly LogService _logService;
public CheckLoginAttribute(LogService logService)
{ _logService = logService;
} public void OnActionExecuted(ActionExecutedContext context)
{ Console.WriteLine(DateTime.Now + "end...");
} public void OnActionExecuting(ActionExecutingContext context)
{ Console.WriteLine(DateTime.Now + "start..."); var path = context.HttpContext.Request.Path;
//context.Result = new RedirectResult($"/Login?returnUrl={path}"); _logService._LogRequest();
}
}
好了咋们一起dotnet run看到的效果如:

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

两者效果是一样的,只是定义一个Filter可以记录其他的日志信息或干其他的事情罢了;这次分享的内容就是这样了,不知道描述的是否清晰,希望多多支持,谢谢。
netcore - MVC的ActionFilter的使用的更多相关文章
- .NetCore MVC中的路由(2)在路由中使用约束
p { margin-bottom: 0.25cm; direction: ltr; color: #000000; line-height: 120%; orphans: 2; widows: 2 ...
- .NetCore MVC中的路由(1)路由配置基础
.NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...
- .netcore mvc docker环境jenkins一键部署(DevOps)
[前言] DevOps方面的文章很早之前就想分享了,挤出一点时间把前段时间搭建的一些提高开发效率的东西给大家分享一下吧. 本文介绍了一个.netcore mvc web项目,从项目push到githu ...
- Asp.NetCore MVC Web 应用
Asp.NetCore MVC 与 普通的MVC 基本一致, 只是代码结构稍有改动 一.创建项目 1. 2. 3. 项目结构 二. 构建数据模型 1. Startup类中配置EF Core MySql ...
- windows 下开发的 .netCore MVC 部署到 Linux(Mint)
这两天在公司跟同事偶然聊到 .netCore,说到一些趋势什么的.但是说来说去自己也没试过在Linux 机子上部署过,所以就试一下. 尝试之前也在网上看了一些文章,包括 Linux 上.netCore ...
- ASP.NETCORE MVC模块化
ASP.NETCORE MVC模块化编程 前言 记得上一篇博客中跟大家分享的是基于ASP.NETMVC5,实际也就是基于NETFRAMEWORK平台实现的这么一个轻量级插件式框架.那么今天我主要分享的 ...
- NETCORE MVC模块化
NETCORE MVC模块化 ASP.NETCORE MVC模块化编程 前言 记得上一篇博客中跟大家分享的是基于ASP.NETMVC5,实际也就是基于NETFRAMEWORK平台实现的这么一个轻量级插 ...
- netcore mvc菜单,角色,权限
netcore mvc快速开发系统(菜单,角色,权限[精确到按钮])开源 AntMgr https://github.com/yuzd/AntMgr 基于netcore2.0 mvc 开发的 快速搭建 ...
- asp.netcore mvc 防CSRF攻击,原理介绍+代码演示+详细讲解
一.CSRF介绍 1.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session ridin ...
随机推荐
- C语言 · 高精度加法
问题描述 输入两个整数a和b,输出这两个整数的和.a和b都不超过100位. 算法描述 由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储.对于这种问题,一般使用数组来处理. 定义一个数组A ...
- 【WCF】自定义错误处理(IErrorHandler接口的用法)
当被调用的服务操作发生异常时,可以直接把异常的原始内容传回给客户端.在WCF中,服务器传回客户端的异常,通常会使用 FaultException,该异常由这么几个东东组成: 1.Action:在服务调 ...
- Matlab 绘制三维立体图(以地质异常体为例)
前言:在地球物理勘探,流体空间分布等多种场景中,定位空间点P(x,y,x)的物理属性值Q,并绘制三维空间分布图,对我们洞察空间场景有十分重要的意义. 1. 三维立体图的基本要件: 全空间网格化 网格节 ...
- Android raw to bmp
Android raw 格式转 bmp 图像 raw 保存的为裸数据,转换时都需要把它转成RGBA 的方式来显示.其中: 8位RAW: 四位RGBA 来表示一位灰度; 24位RAW: 三位RGB相同, ...
- JS与APP原生控件交互
"热更新"."热部署"相信对于混合式开发的童鞋一定不陌生,那么APP怎么避免每次升级都要在APP应用商店发布呢?这里就用到了混合式开发的概念,对于电商网站尤其显 ...
- 带你实现开发者头条APP(四)---首页优化(加入design包)
title: 带你实现开发者头条APP(四)---首页优化(加入design包) tags: design,Toolbar,TabLayout,RecyclerView grammar_cjkRuby ...
- CSS知识总结(七)
CSS常用样式 5.背景样式 1)背景颜色 background-color : transparent | color 常用值:①英文单词,②十六进制,③RGB或RGBA 另外,还有一种是 渐变色彩 ...
- crontab介绍
1.Cron的启动与关闭 由于Cron是Linux的内置服务,可以用以下的方法启动.关闭这个服务: /sbin/service crond start //启动服务/sbin/se ...
- 记录在Windows上安装和使用Oracle数据库过程中的坑
1.安装Oracle Oracle软件是免费的,可以去官网下载相应的安装包.但是如果用于商业用途需要购买License.官网上针对各种平台,32位和64位都有,如果在Windows一般会下载到两个文件 ...
- 关于Linux和Windows下部署mysql.data.dll的注册问题
mysql ado.net connector下载地址: http://dev.mysql.com/downloads/connector/net/ 选择版本: Generally Available ...