最新要闻
- 天天微速讯:工信部发布5月打击治理“黑广播”“伪基站”情况及典型案例
- 6GB大显存亮机卡 英特尔A380显卡杀到759元了:I卡也能Yes
- 特立独行!德国电信挑战欧盟不合理规定:继续购买华为5G设备
- 环球速递!影驰PCIe 5.0 SSD升级提速近40%!最高可达12.4GB/s
- 总票房已超8亿元!动画电影《铃芽之旅》再次宣布密钥延期 世界最新
- 自驾游中出车祸 通用安吉星自动定位报警救车主
- 天天快资讯丨左转被直行撞责任图解(直行撞左拐谁的责任大)
- 环球简讯:高温天气来了,这份权益保护指南请收好
- AMD赞助游戏排斥NVIDIA技术?官方回应耐人寻味
- 北大教授姚洋反对中考分流:40%孩子锁定为低收入者 应10年义务教育 世界快报
- 在拳头中国工作有多爽?上班随时打游戏 老板不能打断
- 男子中近800万彩票后瞒着妻子:妻子要求分割_天天快消息
- 【聚看点】韩系车国内入冬!现代汽车集团CEO:缩减产品线 关停、出售工厂
- 篱落疏疏一径深树头新绿未成阴_篱落疏疏一径深
- 全球播报:恒大地产新增3条被执行记录 执行标的合计8.4亿元
- 全球今热点:危险!男子往保温杯加除垢剂和热水摇晃后爆炸
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
天天速读:ASP.NET Core MVC 从入门到精通之Filter
随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NET Core MVC 系统开发的人员。
经过前几篇文章的讲解,初步了解ASP.NET Core MVC项目创建,启动运行,以及命名约定,创建控制器,视图,模型,接收参数,传递数据ViewData,ViewBag,路由,页面布局,wwwroot和客户端库,Razor语法,EnityFrameworkCore与数据库,HttpContext,Request,Response,Session,序列化,文件上传,自动映射,Html辅助标签,模型校验,鉴权、授权基础,Identity入门,日志管理等内容,今天继续讲解ASP.NET Core MVC 中Filter(筛选器)等相关内容,仅供学习分享使用。
什么是Filter?
Filter又称为筛选器,过滤器。在ASP.NET Core MVC项目中,通过使用Filter,可以在请求处理管道的特定位置之前或之后运行代码。可以创建自定义Filter,用于处理横切关注点,类似于AOP面向切面编程。对于创建Filter,可以减少代码的复制,例如,错误处理异常筛选器可以合并错误处理。
【资料图】
Filter工作原理
从请求开始,到请求结束,经过一系列的节点,组成了调用管道。Filter在ASP.NET Core MVC的调用管道内运行,过滤器相当于在管道中设置的几个钩子,用于执行特定的代码。
Filter类型
根据不同的处理功能,筛选器主要分为以下几类:
授权筛选器AuthorizationFilter:
- 首先运行。
- 确定用户是否获得请求授权。
- 如果请求未获授权,可以让管道短路。
资源筛选器Resource Filter:
- 授权后运行。
- OnResourceExecuting在筛选器管道的其余阶段之前运行代码。 例如,
OnResourceExecuting
在模型绑定之前运行代码。 - OnResourceExecuted在管道的其余阶段完成之后运行代码。
操作筛选器Action Filter:
- 在调用操作方法之前和之后立即运行。
- 可以更改传递到操作中的参数。
- 可以更改从操作返回的结果。
- 不可在 Razor Pages 中使用。
异常筛选器Exception Filter:在向响应正文写入任何内容之前,对未经处理的异常应用全局策略。
结果筛选器Result Filter:
- 在执行操作结果之前和之后立即运行。
- 仅当操作方法成功执行时才会运行。
- 对于必须围绕视图或格式化程序的执行的逻辑,会很有用。
下图展示了Filter筛选器类型在筛选器管道中的交互方式:
Filter实现
所有的Filter都实现接口IFilterMetadata,根据不同的业务类型,派生出了五个接口,分别对应五大类Filter,如下所示:
注意:上述五个接口还有对应异步接口(Async)。
Filter作用域
Filter可以作用在Controller,Action,全局。下面的示例阐释了为同步操作筛选器运行筛选器方法的顺序:
授权Filter
授权筛选器:
- 是筛选器管道中运行的第一个筛选器。
- 控制对操作方法的访问。
- 具有在它之前的执行的方法,但没有之后执行的方法。
如常用的RequireHttps就是授权筛选器,它实现了IAuthorizationFilter接口,并继承了Attirbute,所以可以作用于Controller或Action中。以限制请求的方式。
1 using Microsoft.AspNetCore.Mvc.Filters; 2 using System; 3 4 namespace Microsoft.AspNetCore.Mvc 5 { 6 // 7 // 摘要: 8 // An authorization filter that confirms requests are received over HTTPS. 9 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]10 public class RequireHttpsAttribute : Attribute, IAuthorizationFilter, IFilterMetadata, IOrderedFilter11 {12 public RequireHttpsAttribute();13 14 //15 // 摘要:16 // Specifies whether a permanent redirect, 301 Moved Permanently, should be used17 // instead of a temporary redirect, 302 Found.18 public bool Permanent { get; set; }19 //20 // 值:21 // Default is int.MinValue + 50 to run this Microsoft.AspNetCore.Mvc.Filters.IAuthorizationFilter22 // early.23 public int Order { get; set; }24 25 //26 // 摘要:27 // Called early in the filter pipeline to confirm request is authorized. Confirms28 // requests are received over HTTPS. Takes no action for HTTPS requests. Otherwise29 // if it was a GET request, sets Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext.Result30 // to a result which will redirect the client to the HTTPS version of the request31 // URI. Otherwise, sets Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext.Result32 // to a result which will set the status code to 403 (Forbidden).33 public virtual void OnAuthorization(AuthorizationFilterContext filterContext);34 //35 // 摘要:36 // Called from Microsoft.AspNetCore.Mvc.RequireHttpsAttribute.OnAuthorization(Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext)37 // if the request is not received over HTTPS. Expectation is Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext.Result38 // will not be null after this method returns.39 //40 // 参数:41 // filterContext:42 // The Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext to update.43 //44 // 言论:45 // If it was a GET request, default implementation sets Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext.Result46 // to a result which will redirect the client to the HTTPS version of the request47 // URI. Otherwise, default implementation sets Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext.Result48 // to a result which will set the status code to 403 (Forbidden).49 protected virtual void HandleNonHttpsRequest(AuthorizationFilterContext filterContext);50 }51 }
资源Filter
资源Filter在授权Filter之后执行,需要实现IResourceFilter接口。如下所示:
1 using Microsoft.AspNetCore.Mvc.Filters; 2 3 namespace DemoCoreMVC.Filter 4 { 5 ///6 /// 同步版本 7 /// 8 public class LogResourceFilter :Attribute, IResourceFilter 9 {10 public void OnResourceExecuted(ResourceExecutedContext context)11 {12 //Action执行完成后执行13 Console.WriteLine("********************On Resource Filter Executed********************");14 }15 16 public void OnResourceExecuting(ResourceExecutingContext context)17 {18 //授权Filter执行后执行。19 Console.WriteLine("********************On Resource Filter Executing********************");20 }21 }22 23 ///24 /// 异步版本25 /// 26 public class AsynLogResouceFilter : Attribute, IAsyncResourceFilter27 {28 public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)29 {30 Console.WriteLine("********************On Aysnc Resource Filter Executing********************");31 var exceutedContext = await next();32 Console.WriteLine("********************On Async Resource Filter Executed********************");33 }34 }35 }
如果要使大部分管道短路,资源筛选器会很有用。 例如,如果缓存命中,则缓存筛选器可以绕开管道的其余阶段。
操作Filter
操作筛选器不应用于 Razor Pages。 Razor Pages 支持IPageFilter和IAsyncPageFilter。
操作筛选器:
- 实现IActionFilter或IAsyncActionFilter接口。
- 它们的执行围绕着操作方法的执行。
以下代码显示示例操作筛选器:
1 using Microsoft.AspNetCore.Mvc.Filters; 2 3 namespace DemoCoreMVC.Filter 4 { 5 public class DoDoActionFilter : Attribute, IActionFilter 6 { 7 public void OnActionExecuted(ActionExecutedContext context) 8 { 9 10 Console.WriteLine("********************On Action Executed********************");11 }12 13 public void OnActionExecuting(ActionExecutingContext context)14 {15 Console.WriteLine("********************On Action Executing********************");16 }17 }18 19 public class AsyncDoDoActionFilter : IAsyncActionFilter20 {21 public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)22 {23 24 Console.WriteLine("********************On Async Action Executing********************");25 await next();26 Console.WriteLine("********************On Async Action Executed********************");27 }28 }29 }
ActionExecutingContext提供以下属性:
- ActionArguments- 用于读取操作方法的输入。
- Controller- 用于处理控制器实例。
- Result- 设置
Result
会使操作方法和后续操作筛选器的执行短路。
ActionExecutedContext提供Controller
和Result
以及以下属性:
- Canceled- 如果操作执行已被另一个筛选器设置短路,则为 true。
- Exception- 如果操作或之前运行的操作筛选器引发了异常,则为非 NULL 值。 将此属性设置为 null:
- 有效地处理异常。
- 执行
Result
,从操作方法中将它返回。
对于IAsyncActionFilter
,一个向ActionExecutionDelegate的调用可以达到以下目的:
- 执行所有后续操作筛选器和操作方法。
- 返回
ActionExecutedContext
。
异常Filter
异常筛选器:
- 实现IExceptionFilter或IAsyncExceptionFilter。
- 可用于实现常见的错误处理策略。
下面的异常筛选器示例显示在开发应用时发生的异常的相关详细信息:
1 using Microsoft.AspNetCore.Mvc.Filters; 2 3 namespace DemoCoreMVC.Filter 4 { 5 public class DoExceptionFilter :Attribute, IExceptionFilter 6 { 7 public void OnException(ExceptionContext context) 8 { 9 Console.WriteLine("********************On Exception********************");10 }11 }12 13 public class DoAsyncExceptionFilter : Attribute, IAsyncExceptionFilter14 {15 public async Task OnExceptionAsync(ExceptionContext context)16 {17 await Task.Run(() =>18 {19 Console.WriteLine("********************On Exception Async********************");20 });21 22 }23 }24 }
异常筛选器:
- 没有之前和之后的事件。
- 实现OnException或OnExceptionAsync。
- 处理 Razor 页面或控制器创建、模型绑定、操作筛选器或操作方法中发生的未经处理的异常。
- 请不要捕获资源筛选器、结果筛选器或 MVC 结果执行中发生的异常。
若要处理异常,请将ExceptionHandled属性设置为true
或分配Result属性。 这将停止传播异常。 异常筛选器无法将异常转变为“成功”。 只有操作筛选器才能执行该转变。
异常筛选器:
- 非常适合捕获发生在操作中的异常。
- 并不像错误处理中间件那么灵活。
建议使用中间件处理异常。 基于所调用的操作方法,仅当错误处理不同时,才使用异常筛选器。 例如,应用可能具有用于 API 终结点和视图/HTML 的操作方法。 API 终结点可以将错误信息返回为 JSON,而基于视图的操作可能会以 HTML 形式返回错误页。
结果Filter
结果筛选器:
- 实现接口:
- IResultFilter或IAsyncResultFilter
- IAlwaysRunResultFilter或IAsyncAlwaysRunResultFilter
- 它们的执行围绕着操作结果的执行。
1 using Microsoft.AspNetCore.Mvc.Filters; 2 3 namespace DemoCoreMVC.Filter 4 { 5 public class DoResultFilter :Attribute, IResultFilter 6 { 7 public void OnResultExecuted(ResultExecutedContext context) 8 { 9 Console.WriteLine("********************On Result Executed********************");10 }11 12 public void OnResultExecuting(ResultExecutingContext context)13 {14 Console.WriteLine("********************On Result Executing********************");15 }16 }17 18 public class DoAysncResultFilter :Attribute, IAsyncResultFilter19 {20 public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)21 {22 Console.WriteLine("********************On Result Execution Async Executing********************");23 await next();24 Console.WriteLine("********************On Result Execution Async Executed********************");25 }26 }27 28 }
Filter测试
将写好的过滤器,放在Home/Index上,如下所示:
1 [DoExceptionFilter]2 [LogResourceFilter]3 [DoResultFilter]4 [DoDoActionFilter]5 public IActionResult Index()6 {7 _logger.LogInformation("Hello, 这是首页!");8 return View();9 }
测试如下所示:
说明:异常过滤器没有输出内容,是因为没有异常产生。授权过滤器没有添加,在所有过滤器之前开始,所有过滤器之后结束。
Filter全局应用
Filter可以应用在单个Controller或Action上,也可以进行全局应用,代码如下所示:
1 builder.Services.AddControllersWithViews(option =>2 {3 option.Filters.Add();4 option.Filters.Add ();5 option.Filters.Add ();6 option.Filters.Add ();7 });
全局测试如下所示:
以上就是ASP.NET Core MVC 从入门到精通之Filter的全部内容。
参考文档
官方文档:https://learn.microsoft.com/zh-cn/aspnet/core/mvc/controllers/filters?view=aspnetcore-6.0
关键词:
天天速读:ASP.NET Core MVC 从入门到精通之Filter
RTOS任务进行单元测试的4种策略
天天微速讯:工信部发布5月打击治理“黑广播”“伪基站”情况及典型案例
6GB大显存亮机卡 英特尔A380显卡杀到759元了:I卡也能Yes
特立独行!德国电信挑战欧盟不合理规定:继续购买华为5G设备
环球速递!影驰PCIe 5.0 SSD升级提速近40%!最高可达12.4GB/s
总票房已超8亿元!动画电影《铃芽之旅》再次宣布密钥延期 世界最新
自驾游中出车祸 通用安吉星自动定位报警救车主
Spring Boot 调用外部接口的 3 种方式,还有谁不会?!
世界讯息:如何做mysql调优?绝命7招,让慢SQL调优100倍
浅析GeoServer CVE-2023-25157 SQL注入_全球热消息
java中synchronized和ReentrantLock的加锁和解锁能在不同线程吗?如果能,如何实现?
天天快资讯丨左转被直行撞责任图解(直行撞左拐谁的责任大)
环球简讯:高温天气来了,这份权益保护指南请收好
AMD赞助游戏排斥NVIDIA技术?官方回应耐人寻味
北大教授姚洋反对中考分流:40%孩子锁定为低收入者 应10年义务教育 世界快报
在拳头中国工作有多爽?上班随时打游戏 老板不能打断
男子中近800万彩票后瞒着妻子:妻子要求分割_天天快消息
【聚看点】韩系车国内入冬!现代汽车集团CEO:缩减产品线 关停、出售工厂
篱落疏疏一径深树头新绿未成阴_篱落疏疏一径深
环球焦点!发力电子后视镜CMS,芯驿电子与映赛科技达成战略合作
债市日报:6月21日 天天速看
全球微动态丨【财经面对面】平安健康互联网医院院长杨昆:加快AI赋能 打造O2O医疗健康服务
【金融街发布】人民银行:深入推进金融系统审计整改工作
全球播报:恒大地产新增3条被执行记录 执行标的合计8.4亿元
全球今热点:危险!男子往保温杯加除垢剂和热水摇晃后爆炸
端午节后连上6天班 专家称调休多上一天班提高不了效率
环球新资讯:杭州一男子绿化带内迷路四天三夜:吃野花喝露水求生
你相信光吗?FF91交付推迟 贾跃亭激情发文回应:加速中国落地等_世界观察
AI化身“印钞机”!扎克伯格等4位富豪因其暴赚10000亿_环球快看
湖北省商务厅第七届中俄博览会出访行程公布
MyBatis-Plus 实现动态字段排序|播资讯
环球热点评!【技术积累】数据结构中的基本概念【一】
多卡训练_环球热闻
快看点丨记录--新的HTML标签 :
每日看点!安徽35岁女子在上海相亲,被62岁大爷相中,直言每月给30万零花钱
什么是核心素养?
每日热门:空气循环扇和传统风扇怎么选?别再被商家忽悠了
印度德里地铁将支持手机二维码乘车 网友:遥遥领先 焦点关注
当前热文:马斯克又出惊人语录:做生意是为了促进和保护人类文明
苹果受益!国产手机在德国等欧洲市场没法卖了:诺基亚用专利封杀 世界百事通
焦点热议:腾讯《三体》编剧:奈飞版《三体》一集的预算能拍我们一整部 技术太落后
312斤女网红在减肥营离世,专家:减肥不当会闭经,每周减重不要多于1Kg-时快讯
不请自来!哪些猫咪品种经常光顾邻居家?_今日精选
环球微头条丨AI教你实现敏捷游戏自由,再也不用担心陷入瓶颈啦!
Linux Powershell 安装教程 天天快播报
C#语言async, await 简单介绍与实例(入门级) 当前聚焦
北向资金全天小幅净卖出6.41亿元 时讯
读懂“中文大脑”,破解阅读障碍
信用卡逾期收到律师函怎么办?信用卡逾期律师函来了后果严重吗?
新动态:彩票为什么不能网上卖_彩票为什么不能网上买
首款骁龙8 Gen2平板要来了:内置散热风扇 游戏神器|环球今头条
每日报道:AI血洗时尚圈!就连这些线上店家都开始用AI生成爆款了
电池有缺陷被特斯拉踢出供应链?宁德时代辟谣:消息不实
宣告放弃LCD材料!三星、LG供应商默克集团全力研发MicroLED等新材料
天天速讯:高考查分遇上端午假期:31省成绩23日起陆续公布
台电P76t_台电p76v
红楼梦摘抄400字_红楼梦摘抄
【全球新视野】柔道著名运动员(郝义 柔道运动员)
五证一书指什么生肖(五证一书指什么)|世界最新
A股分红派息转增一览:43股今日股权登记
每日焦点!苹果或重新发明苹果汽车安全带:打造发光安全带扣
又瞎折腾!Windows 11将删除9个文件夹选项
帮人就是帮己!西南大学校长毕业寄语被狂赞:外卖别随意给差评 大胆扶摔倒老人_环球观焦点
keycloak~CountDownLatch在keycloak中的使用 资讯推荐
高精度离线免费 的C#文字识别PaddleOCR库|速递
环球快讯:星纪魅族官宣参展2023 MWC上海:Flyme Auto、魅族20系列重磅登场
每日热文:余承东大喜!工信部:支持L3级及更高级别自动驾驶功能商业化应用
鲜嫩入味 Q弹不柴:驰迈即时鸡胸肉50g*5袋9.9元_天天看点
全球时讯:《闪电侠》预示华纳影业面临巨大亏空
环球今热点:国服关停5个月后:成都猎人队宣布彻底退出《守望先锋》联赛
全球简讯:即视角|出海正当时:欧美、东南亚、中东、拉美市场观察
参展动态 | 璞华参展第九届中国(上海)国际技术进出口交易会-全球关注
国泰君安:5月挖机销量略超预期,静待下半年行业复苏
致命摇篮下载 1080p 下载 致命摇篮迅雷下载 全球微动态
【世界新视野】京雄大桥顺利合龙!京雄高速将于年内全线通车(图)
【快播报】印尼很快将不再出口原铜因希望从资源中寻求更多价值金十数据6月21日讯,印度尼西亚总统佐科当地时间周二表示,该国很快将不再出口原铜,因为这一金属将在国内
首销仅售32元:3DMark登陆Epic商店
国内油价冲破上调红线!端午节过后涨价可能性很大
笔记本存储“官方升级”谁最贵最坑?对比后揭晓答案 新资讯
免费玩!国产大作《仙剑奇侠传7》即将登陆XGP订阅服务-当前短讯
演员陈建斌多巴胺穿搭引热议 律师:AI换脸侵犯肖像权
全球热推荐:官宣!NBA历史第一高薪即将诞生,哈登交易方案,勇士3人离队
万能u盘低级格式化工具下载_u盘格式化工具下载-世界热推荐
关于在Redhat-7-linux-系统-Apache-2.4.6-版本上部署多个版本的yum仓库-的配置文件写法
【Java】使用 validation 完成自定义校验注解 今日热文
性能提升30%!袋鼠云数栈基于 Apache Hudi 的性能优化实战解析|世界新视野
视频直播源码技术知识分享:连麦功能(一)
环球即时看!ClickHouse(14)ClickHouse合并树MergeTree家族表引擎之VersionedCollapsingMergeTree详细解析
北汽极狐成立法务部:200万粉丝知名汽车博主收到“告知函” 快资讯
中国首位!科学家付巧妹获联合国阿勒福赞奖-全球快播
226元大额券:361板鞋运动鞋休闲鞋74元抄底|全球百事通
离大谱!男子偷马路卖钱:把路分成小块去卖 天天时讯
3岁女童患罕见病 肚大如石鼓随时会“爆炸”:医生科普 续命针1次上万-环球快播
当前滚动:【后端面经-java】java线程池满的处理策略
Rust语言 - 接口设计的建议之受约束(Constrained)_天天最资讯
java~理解可重入锁 焦点速读
硬件博主自费实测5大旗舰手机信号:iPhone各种被狂虐
焦点热文:载亿万富翁观光潜艇失联 被曝用游戏手柄操控 专家:生还希望渺茫
电动汽车也能无线充电了:像手机一样简单 超大充电板长这模样