ASP.NET MVC5 的请求管道和运行生命周期
https://www.jianshu.com/p/848fda7f79e0
请求处理管道
请求管道是一些用于处理HTTP请求的模块组合,在ASP.NET中,请求管道有两个核心组件:IHttpModule
和IHttpHandler
。所有的HTTP请求都会进入IHttpHandler
,有IHttpHandler
进行最终的处理,而IHttpModule
通过订阅HttpApplication
对象中的事件,可以在IHttpHandler
对HTTP请求进行处理之前对请求进行预处理或IHttpHandler
对HTTP请求处理之后进行再次处理。
在IIS7之前,如IIS6或IIS5,请求处理管道分为两个:IIS请求处理管道和ASP.NET管道,若客户端请求静态资源则只有IIS管道进行处理,而ASP.NET管道不会处理该请求。从IIS7开始两个管道合二为一,称为集成管道。
上图中主要描述ASP.NET运行时对HTTP请求的处理且不涉及太多细节。
HttpApplication与HttpModule
HTTP请求由ASP.NET Runtime 接管之后,HttpRuntime
会利用HttpApplicationFactory
创建或从HttpApplication
对象池(.NET中类似的机制有线程池和字符串拘留池)中取出一个HttpApplication
对象,同时ASP.NET会根据配置文件来初始化注册的HttpModule
,HttpModule
在初始化时会订阅HttpApplication中的事件来实现对HTTP请求的处理。
在ASP.NET MVC5中,Global.asax
文件中定义了MvcApplication
类,继承自HttpApplication
类:
Application_Start()
方法最先执行,一般在该方法中添加一些配置,如路由注册、全局过滤器的注册等。
Route
一个HTTP请求会经过至少一个HttpModule
的处理。UrlRoutingModule
是非常重要的模块,它是路由系统的核心。路由系统的职责是从请求URL中获取controller和action的名称以及其它请求数据。
UrlRoutingModule
根据当前请求的URL和RouteTable
中已注册的路由模板进行匹配并返回第一个和当前请求相匹配的路由对象Route
,然后根据路由对象Route
获取路由数据对象RouteData
(ASP.NET MVC中,路由数据必须包含controller和action的名称),再有RouteData
获取 ==> IRouteHandler
获取==>
IHttpHandler
HttpHandler
一个HTTP请求最终要进入HttpHanler中进行处理,一次HTTP请求只能被一个HttpHandler进行处理。
Controller
IHttpHandler
在ProcessRequest
方法中对当前请求进行处理,在该方法中通过ControllerBuilder
得到IControllerFactory
然后通过反射的方式获取Controller
的类型。
Action
ASP.NET MVC中ControllerBase
是所有Controller
的基类,在该类型的Execute
方法中通过IActionInvoker
的InvokeAction
方法来执行对Action
的调用。在Action
执行前会进行模型绑定和模型认证操作。
Filters
在ASP.NET MVC5中有常用的过滤器有5个:IAuthenticationFilter
、IAuthorizationFilter
、IActionFilter
、IResultFilter
、IExceptionFilter
。
在ASP.NET MVC中所有的过滤器最终都会被封装为Filter
对象,该对象中FilterScope
类型的属性Scope
和int
类型属性Order
用于决定过滤器执行的先后顺序,具体规则如下:
Order
和FilterScope
的数值越小,过滤器的执行优先级越高;Order
比FilterScope
具有更高的优先级,在Order
属性值相同时FilterScope
才会被考虑
//数值越小,执行优先级越高
public enum FilterScope
{
Action= 30,
Controller= 20,
First= 0,
Global= 10,
Last= 100
}
ActionResult
Action
执行完毕之后会返回ActionResult
类型对象作为对此次请求进行处理的结果,对于不是ActionResult
类型的返回值,ASP.NET MVC会将其转换为ActionResult
类型。
请求生命周期
ASP.NET 应用程序的生命周期以浏览器向 Web 服务器发送请求为起点,请求到达服务器后进入处理管道,至浏览器接收服务器响应时为止。
最后附上一张老外绘制的ASP.NET请求管道图,图片来自《ASP.NET MVC Interview Questions and Answers Book》这本书。
书目推荐
ASP.NET MVC 5 APPLICATION LIFECYCLE – HIGH-LEVEL VIEW(强烈推荐)
ASP.NET WEB API 2: HTTP MESSAGE LIFECYLE(墙裂推荐)
《ASP.NET MVC Interview Questions and Answers Book》
《ASP.NET MVC5框架揭秘》
参考文章
IIS 7.0 的 ASP.NET 应用程序生命周期概述
The IIS7 Integrated Pipeline
ASP.NET MVC5 的请求管道和运行生命周期的更多相关文章
- asp.net请求管道和页面生命周期
- Asp.net MVC进入请求管道的过程
Asp.net MVC进入请求管道的过程 Asp.Net MVC 跟AspNet 入口解释 Asp.Net MVC请求处理过程 mvc 请求模型 mvc的原理 mvc模型 NewMVCPipleLin ...
- ASP.NET MVC 小牛之旅4:ASP.NET MVC的运行生命周期
ASP.NET MVC的运行生命周期大致分成三大过程:(1)网址路由对比. (2)运行Controller与Action. (3)运行View并回传结果. 4.1网址路由对比 当iis收到http请求 ...
- ASP.NET整理:Cookie,Application,Session,页面生命周期
一.设置Cookie的2种方式 1. Repsonse.Cookie[“名”] = 值; 2. HttpCookie hcCookie = new HttpCookie(“名”,值); h ...
- 【转载】ASP.NET线程安全与静态变量的生命周期浅谈
ASP.NET线程安全所涉及的是什么呢?让我们先来看看静态变量的生命周期问题,下面是我理解的静态变量的生命周期: void Application_Start开始 void Application_E ...
- laravel请求到响应的生命周期
请求到响应的核个执行过程,主要可以归纳为四个阶段,即程序启动准备阶段.请求实例化阶段.请求处理阶段.响应发送和程序终止阶段. public\index.php中有这么一段代码 $app = requi ...
- Laravel学习:请求到响应的生命周期
Laravel请求到响应的整个执行过程,主要可以归纳为四个阶段,即程序启动准备阶段.请求实例化阶段.请求处理阶段.响应发送和程序终止阶段. 程序启动准备阶段 服务容器实例化 服务容器的实例化和基本注册 ...
- ASP.NET MVC5请求管道和生命周期
请求处理管道 请求管道是一些用于处理HTTP请求的模块组合,在ASP.NET中,请求管道有两个核心组件:IHttpModule和IHttpHandler.所有的HTTP请求都会进入IHttpHandl ...
- 13、ASP.NET MVC入门到精通——MVC请求管道
本系列目录:ASP.NET MVC4入门到精通系列目录汇总 ASP.NET MVC的请求管道和ASP.NET请求管道基本上一模一样,如果你对ASP.NET请求管道十分熟悉的话,你只要关注一下不同点.看 ...
随机推荐
- 数组和CLR-非常特殊的关系
目录 数组和CLR-非常特殊的关系 公共语言运行时(CLR)的基础 内存和类型安全 实现细节 特殊帮助器类 移除边界检查 分配数组 运行时以不同的方式对待数组 进一步阅读 数组源码引用 参考文档 数组 ...
- nrm安装与配置(nrm管理npm源)
1.nrm nrm(npm registry manager )是npm的镜像源管理工具,有时候国外资源太慢,使用这个就可以快速地在 npm 源间切换 2.安装nrm 在命令行执行命令,npm ins ...
- IT运维软件免费送 智和信通战疫活动火热进行中
突如其来的“新型冠状病毒”疫情牵动了全国人民的心,这是一场与病毒抗争,为生命逆行与时间赛跑的战役.举国上下众志成城面对疫情,在线医疗.在线教学.在线办公.在线会议.电商销售成为热点.线上经济的火热给企 ...
- Shiro -- (三) 自定义Realm
简介: Realm:域,Shiro 从从 Realm 获取安全数据(如用户.角色.权限),就是说 SecurityManager 要验证用户身份,那么它需要从 Realm 获取相应的用户进行比较以确定 ...
- 学会springboot多环境配置方案不用5分钟
一 前言 本篇文章的主题是在springboot中写多个配置文件,指定让个配置文件生效,以便于达到在开发环境,测试环境,线上环境根据不同的配置灵活应用:读完本篇你将获得,学会springboot的多环 ...
- mysql查询时不区分大小写
一次偶然的机会,发现在登陆验证时,改变用户名的大小写,同样可以登录成功,这是由于,当时使用的mysql数据库对大小写不敏感,查询时总是能查询到数据.一番查找资料,给出的原因是:在创建数据库的时候,选择 ...
- MySQL Execute Plan--Index Merge特性
Index Merge特性 在MySQL 5.5之前版本中,查询或子查询被限制在一个表只能使用一个索引(回表查询除外). 假设表TB1001上C1和C2列分别有单列索引,如对下面查询: SELECT ...
- PRML学习准备
因为很怕PRML课程,所以想提前学习下做点准备. 看的一个学习内容就是python数据处理那本书,比较仔细地学习了 numpy,大致看了pandas和 matplotlib ,有以下几点感受 nump ...
- STL中的Set和Map——入门新手篇
STL中的Set和Map 先来看一段网络上的文字描述: 上图是一段关于STL中Set集合的描述,同样的,也近似适合Map的描述.上述文字中,描述了最为重要的特征: Set和Map,底层调用了红黑树的结 ...
- SQL Server无法连接到服务器 标题: 连接到服务器 ------------------------------ 无法连接到 DESKTOP-J6I1UIC\SQLEXPRESS1。 ------------------------------ 其他信息: 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。
解决方案: 打开 SQL server 配置管理器 选择 SQL server 服务,找到服务器,右键启动