.net core 拦截器的使用
.net core 拦截器的使用
实例代码:https://gitee.com/d_c_l/interceptortest.git
拦截器主要是将程序中的一些可以独立出去的模块进行拦截,比如幕等性,和身份认证服务等等,你想独立出去的东西,actionfilterattribute请求拦截器他里面几个方法,我们将一下的几个方法进行重写。
1,onactionexecuting:在执行请求开始之前进行调用
2,onactionexecuted:在执行请求开始之后进行调用
3,onresultexecuting:在执行请求结束前进行调用
4,onresultexecuted:在执行请求结束后进行调用
列如:
/// <summary> /// 在执行请求开始之前进行调用 /// </summary> /// <param name="context">执行的上下文</param> public override void onactionexecuting(actionexecutingcontext context) { context.httpcontext.response.writeasync("在控制器执行之前调用"); }
里面可以编写你的代码,actionexecutingcontext 是请求进来的 上下文。
这个是里面的一些属性,你可以进行相对应的使用。、
异常拦截器的使用
iexceptionfilter实现这个接口,在startup类里面添加 app.useexceptionhandler("/home/error");也可以调到错误页面去。或者想下面重写
/// <summary> /// 当然是发生异常时被调用了 /// </summary> /// <param name="context">执行的上下文</param> public void onexception(exceptioncontext context) { context.httpcontext.response.writeasync("当然是发生异常时被调用了"); context.exceptionhandled = true;//异常已经处理,不要再次处理了 }
全局拦截
如果说你要拦截你程序的所有请求,可以将拦截器配置到全局里面在startup类添加一下代码。
actionattribute是你拦截器的类名
//全局拦截 services.addmvc(options => { options.filters.add(typeof(actionattribute)); }).setcompatibilityversion(compatibilityversion.version_2_2);
部分控制器不进行拦截
当我们使用了全局拦截器之后,但是有的方法或者控制器我不想进行拦截器的话,我们可以编写一个空的拦截器不使用全局拦截器。
/// <summary> /// 不需要登陆的地方加个这个空的拦截器 /// </summary> public class nosignattribute : actionfilterattribute { }
然后在方法或者控制器上面添加一下代码
nosignattribute本来拦截器名称是这样的,我们可以忽略后面的默认名命nosign
/// <summary> /// 不需要登录使用这个[nosign] 拦截器 /// </summary> /// <returns></returns> [nosign] public iactionresult privacy() { return view(); }
然后我们在全局的拦截器里面在加上一段判断的代码,其实这个就是加上的两个拦截器,只是一个没有用,判断当前的请求方法或者控制上面有没有这个空的拦截器,如果有说明我们这个方法或者控制器不需要被拦截。直接返回出去。
/// <summary> /// 在控制器执行之前调用 /// </summary> /// <param name="context">执行的上下文</param> public override void onactionexecuting(actionexecutingcontext context) { // 判断是否加上了不需要拦截 var noneedcheck = false; if (context.actiondescriptor is controlleractiondescriptor controlleractiondescriptor) { noneedcheck = controlleractiondescriptor.methodinfo.getcustomattributes(inherit: true) .any(a => a.gettype().equals(typeof(nosignattribute))); } if (noneedcheck) return; context.httpcontext.response.writeasync("在控制器执行之前调用"); }
局部拦截
如果说你只想拦截某个控制器或者某个方法的时候,你可以在方法或者控制器上面添加拦截器的注释。
actionattribute本来拦截器名称是这样的,我们可以忽略后面的默认名命action
/// <summary> /// 局部的使用拦截器 /// </summary> /// <returns></returns> [action] public iactionresult index() { return view(); }
当然如果你不想使用拦截器,喜欢用中间件也可以,在管道请求的管道中直接进行拦截,这也是可以的。
如果有错误的地方,请帮我纠正。哈哈一起加油陌生人!!
下一篇: 如何快速查看 group 对应的id
推荐阅读
-
.net core ajax使用EPPlus上传excle导入总结
-
.Net Core API使用ODP.NET操作Oracle数据库
-
一个基于Net Core3.0的WPF框架Hello World实例
-
【翻译】使用WebApi和Asp.Net Core Identity 认证 Blazor WebAssembly(Blazor客户端应用)
-
(24)ASP.NET Core EF查询(查询的工作原理、跟踪与非跟踪查询)
-
超简单让.NET Core开发者快速拥有CI/CD的能力-Docker版本
-
在Asp.Net或.Net Core中配置使用MarkDown富文本编辑器有开源模板代码(代码是.net core3.0版本)
-
ASP.NET Core 3.0 : 二十八. 在Docker中的部署以及docker-compose的使用
-
我来告诉你:VS2019开发ASP.NET Core 3.0 Web项目,修改视图后,刷新浏览器看不到修改后的效果怎么处理
-
.NET Core Razor Pages中ajax get和post的使用