netcore - MVC的ActionFilter的使用
经过一周的时间没有分享文章了,主要是在使用.netcore做一个小的项目,项目面向大众用户的增删改查都做的差不多了,打算本周在云服务器上部署试试,很期待,也希望上线后大家多多支持;以上纯属个人废话,来一起看看今天的正篇环节:
.继承IActionFilter来定义个验证登录的流程例子
.ActionFilter中怎么使用依赖注入
下面一步一个脚印的来分享:
.继承IActionFilter来定义个验证登录的流程例子
首先,咋们定义一个名叫FilterTestController的Controller,返回一个JsonResult结果;为了例子查看的方便性,同时在此文件中定义一个名MoResponse的类,对应的代码如下:
public class FilterTestController : Controller
{
public JsonResult Index()
{
var response = new MoResponse();
response.Status = 1;
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 = 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中增加代码如:
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可以记录其他的日志信息或干其他的事情罢了;这次分享的内容就是这样了,不知道描述的是否清晰,希望多多支持,谢谢。
原文地址:http://www.cnblogs.com/wangrudong003/p/5750583.html
.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注
netcore - MVC的ActionFilter的使用相关推荐
- ASP.netcore MVC钉钉H5微应用(一)准备工作
本文是我在做ASP.netcore MVC钉钉H5微应用的第一章,准备工作 首先,进入钉钉开发平台,需要自己在钉钉上创建一个工作室,然后申请成为开发者,并创建一个H5微应用 在H5微应用里填写需要的信 ...
- Asp.NetCore MVC Web 应用
Asp.NetCore MVC 与 普通的MVC 基本一致, 只是代码结构稍有改动 一.创建项目 1. 2. 3. 项目结构 二. 构建数据模型 1. Startup类中配置EF Core MySql ...
- .netcore mvc docker环境jenkins一键部署(DevOps)
[前言] DevOps方面的文章很早之前就想分享了,挤出一点时间把前段时间搭建的一些提高开发效率的东西给大家分享一下吧. 本文介绍了一个.netcore mvc web项目,从项目push到githu ...
- netcore mvc快速开发系统(菜单,角色,权限[精确到按钮])开源
基于netcore2.0 mvc 开发的 快速搭建具有如下特色的后台管理系统 用户管理 菜单管理 角色管理 权限管理[精确到按钮]) 代码生成器 代码克隆到本地 用vs2017或以上版本 打开工程. ...
- ASP.netcore MVC钉钉H5微应用(二)鉴权
官方文档:鉴权 由于官方文档没有C#的,所以自己弄了个C#的 需要注意的是,不是所有功能都需要鉴权,但是在需要鉴权的地方,一定要有 -第一步:获得access_token 我使用的是企业内部应用 具体 ...
- .NETCore MVC上传图片
前端代码 使用之前先引入Layui的css跟js包 <div class="layui-upload"><button type="button&quo ...
- .NET Core MVC扩展实践
源宝导读:明源云ERP的底层架构正在向.Net Core跨平台迁移,我们在过程中遇到了部分不兼容的问题.本文将介绍技术团队如何解决.Net Core与已有MVC框架不兼容问题的解决方案. 一.背景 云 ...
- 为什么 web 开发人员需要迁移到. NET Core, 并使用 ASP.NET Core MVC 构建 web 和 API
2018 .NET开发者调查报告: .NET Core 是怎么样的状态,这里我们看到了还有非常多的.net开发人员还在观望,本文给大家一个建议.这仅代表我的个人意见, 我有充分的理由推荐.net 程序 ...
- 使用EF Core和AngularJS的Master Chef(第3部分)ASP.NET Core MVC
目录 介绍 在Visual Studio 2015更新3中创建MasterChef2应用程序 更新project.json(Nuget程序包) 配置MVC和静态文件 从现有数据库创建模型 添加Web ...
最新文章
- python使用手册-python 教程与手册(60IN1合集)
- BP神经网络基本原理
- 推荐五星级C语言学习网站
- PowerShell 收集计算机相关信息
- 一个表格中文字怎么换行_Excel表格中怎样快速将阿拉伯数字转化为大写文字?这样操作一键完成...
- docker 修改容器的主机名
- Bean的依赖注入方式
- ABAP webservice和log on对话框相关的实现细节调试
- HTML5清除2个div标签的空白,DIV标签里面IMG图片下方留有空白怎么办
- CSS中flex和inline-flex的区别
- 初学oracle遇到些小麻烦
- Java多线程设计要点
- 写了个关于tomcat项目部署脚本 shell
- 关于C++中的继承感悟
- 类成员指针——偏移量
- 数字通信原理与TCP/IP
- 视频md5修改器苹果手机
- java openxml_Excel单元格中的OpenXml和Date格式
- BootStrap3 排版
- JavaScript使用手册(一)
热门文章
- SkyWalking集成与案例
- Orchard Core 1.0.0 正式发布!
- 如何在 ASP.Net Core 中使用 File Providers
- 划入 .NET 6版本目标,微软鼓励开发人员信任第三方库
- 我是如何把 Java 项目移植到 .NET 5.0 的
- .NET 开源项目 StreamJsonRpc 介绍[下篇]
- 测试人员未来的3条出路
- WTM系列视频教程:先导篇
- .net core 实现基于 JSON 的多语言
- 关于C#异步编程你应该了解的几点建议