首页 程序笔记 IL源码解读,理解MVC里面Filter这个AOP的实现原理

IL源码解读,理解MVC里面Filter这个AOP的实现原理

MVC的请求是由Action响应的,Action是一个实例方法,得先实例化控制器再InvokeAction,MVCHandler完成Controller的实例化,控制器的实例+Action名称交给ControllerActionInvoker,InvokeAction找出Filter,做各种检查,如果Result不为空就直接Result,如果为空继续执行Action。

IL解读MVCHandler

ProcessRequest里实例化控制器,controller.Excute完成方法调用。

子类里执行ExcuteCore,负责调用方法。ControllerActionInvoker的InvokeAction执行Action方法。

找出Descriptor描述的特性,Filter,先检查Filter,如果有Result就直接返回Result,如果没有Result再执行Action。

MVC再调用方法前检查了特性,满足某个特性就先执行特性的东西,这样就等同在方法前加入了新的逻辑。这就是AOP的效果。

示例:权限验证AOP实现[Authorize]

OnAuthorization这个方法会发生在Action执行之前。效果:在没有修改Action,Action执行前,能自动取执行AuthorizeAttribute的方法。

1 标记到Action,Action注册,只对Action生效

2 Controller注册,对Controller生效

3 全局注册,在Global注册FilterConfig

[AllowAnonymous]标记匿名特性,全局检测需要在AuthorizeAttribute里处理支持,方法如下

 if (filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true))

    return;

if (filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true))

    return;

1

站心网

MVC的请求是由Action响应的,Action是一个实例方法,得先实例化控制器再InvokeAction,MVCHandler完成Contr..

为您推荐

彩虹目录列表程序v1.5源码下载

彩虹目录列表是一款用PHP开发的目录列表程序,无需数据库,安装简单,使用方便。功能特点:在线预览图片、视频、音频、文本文件、Markdown文件、Office文档等自动识别目录下的README.md文件并展示(类GitHub)后台管..

新版彩虹工具网源码v1.9.0更新

新版彩虹工具网采用ThinkPHP6.0开发,自带70多个工具,包含站长工具、开发工具、实用工具、娱乐工具等分类,支持工具插件扩展,支持留言、用户注册登录、后台管理功能。目前已经更新到了1.9版本,新增了QQ等级查询、..

使用 html2canvas 实现截图功能

html2canvas 是一个开源的 JavaScript 库,用于将网页上的 HTML 元素渲染成图像。它通过遍历页面的 DOM 树和计算样式,然后将其绘制到 <canvas> 元素上,最终生成图片。该库不依赖服务器端,而是通过浏览器端的 Java..

一个简单的大转盘抽奖程序(附.NetCore Demo源码)

最近闲下来在做一些demo,现在讲一下做的一个简单的大转盘抽奖demo,前端lottery,layui,后端.net core,sqlsugar,数据库用的mysql1.前端实现:前端用的是基于开源的lottery,其中有些改动的,使得前端可以自适应pc端..

网站统计中的访问信息收集的前端实现

网站数据统计分析工具是网站站长和运营人员经常使用的一种工具,比较常用的有谷歌分析、百度统计和腾讯分析等等。所有这些统计分析工具的第一步都是网站访问数据的收集。目前主流的数据收集方式基本都是基于javascri..

使用SuperWebSocket实现Web消息推送

在大部分Web系统中,我们可能遇到需要向客户端推送消息的需求。SuperWebSocket第三方库能让我们轻松的完成任务。SuperWebSocket第三方库可以从网上下载,不过通过Visual Studio Nuget安装更快。引用SuperWebSocket相..

.NET C# 使用Hook钩子实现全局监听键盘和鼠标

C# 是一种面向对象的编程语言,具有丰富的类库和工具支持,适用于各种类型的应用程序开发。Windows 提供了一种称为"钩子"(Hook)的机制,允许拦截并处理系统级别的事件,如键盘按键和鼠标移动。通过结合 C# 和 Hook..

.NET C#连接FTP实现文件上传下载

在 .NET 中可以使用 System.Net.FtpWebRequest 类来连接 FTP 服务器,实现文件上传和下载。以下是实现文件上传和下载的完整代码示例。1. 上传文件到 FTP 服务器using System;using System.IO;using System.Net;class..

C#使用 Attribute 实现 AOP 功能

在 C# 中,通过自定义 Attribute 并结合一些技术(如动态代理、反射等)可以实现 AOP(面向切面编程)。AOP 通常用于日志记录、性能监控、权限验证等横切关注点。以下是一个使用 C# Attribute 实现 AOP 功能的示例。..

使用CSS columns-visibility实现砌体布局

CSS的 columns 属性(如 columns、column-count 和 column-width)通常用于多列文本布局,而不是直接用于砌体布局。然而,结合 columns 和 visibility 属性,可以在某些情况下实现类似砌体布局的效果,虽然它并不完..

js使用IntersectionObserver实现锚点在当前页面视口时导读高亮

在 JavaScript 中可以通过监听页面滚动事件,检查每个锚点的位置,并根据当前滚动位置高亮相应的导航项,从而实现页面内锚点链接的导读高亮效果。交叉观察器 API(Intersection Observer API)提供了一种异步检测目..

js使用scroll事件实现锚点滚动到页面顶部时导航高亮

在 JavaScript 中,可以通过监听页面滚动事件,并判断页面顶部与各个锚点的距离来实现导航高亮效果。当某个锚点的内容块滚动到页面顶部时,自动高亮相应的导航项。以下是实现方式:1. HTML 结构假设我们有多个内容区..

Blazor的N种渲染模式原理和常见问题说明

我们从下面这幅图开始,下图显示了三种渲染模式,分别称之为静态SSR、交互式SSR(即之前的BlazorServer)、交互式CSR(即之前的BlazorWasm)。还有一种渲染模式BlazorHybrid,稍后说。一、先浅层理解一个图例静态SSR:经..

ASP.NET Core实现多语言本地化Web应用程序

构建全球可访问的网站和应用程序需要对内容进行适当的本地化,以吸引来自不同文化和地区的用户。ASP.NET Core 提供强大的本地化支持,以用户首选的语言和格式呈现内容。在本综合指南中,我们将探索 ASP.NET Core 中..

C#发送邮件代码简洁示例(附源码下载)

C#发送邮件,主要使用的是System.Net.Mail命名空间下的方法实现,方法很简单,短短十几行代码即可完成发送,具体代码如下。 try { MailMessage myMail = new MailMessage(); myMail.From = new MailAddress..

支付宝第三方支付平台对接原理和实现

如果把商户网站使用第三方支付平台(比如支付宝)的原理搞清楚,那编程就变得简单多了。 整个过程大致这样: 1、商户与支付宝签约。 2、在商户网站购买商品,填写数量,确定购买后跳转到结账页面。结账页面可能包括订..

类似php iconv的函数功能,C#实现方法

在与一个第三方接口对接时,发现对方无法用GZip解压我发过去的数据,看了对方PHP的示例代码,发现对方使用的是PHP的$file = iconv("IOS-8859-1","UTF-8",gzencode($data_json));大致意思是要先压缩,在把压缩的数组..

c#实现与Java无差异的GZip压缩和GZip解压缩

c#实现与Java无差异的GZip压缩和GZip解压缩,其中有个坑就是GZip压缩的时候,只有在GZipStream在Dispose后调应对应MemoryStream.ToArray()所得到的结果才是正确的压缩数据。如果在zipStream.Write(bytes, 0, bytes.L..

EasyNetQ使用方法示例附源码

使用Nuget安装EasyNetQ本示例源码下载http://www.leavescn.com/Files/downloads/MQTest.zip创建连接:使用EasyNetQ连接RabbitMQ,是在应用程序启动时创建一个IBus对象,并且,在应用程序关闭时释放该对象。RabbitMQ..

.NET Core 管道模型中间件及管道模拟实现

管道,PipelineASP.NET Core 路由,认证,绘画,缓存,都是由管道来处理的中间件。MVC WEB API,都是建立在某个特殊的中间件之上。MVC,路由的中间件,请求地址和控制器之间的映射,在此基础上实现了实例化控制器,..

发表回复

返回顶部