https://www.jianshu.com/p/848fda7f79e0

请求处理管道

请求管道是一些用于处理HTTP请求的模块组合,在ASP.NET中,请求管道有两个核心组件:IHttpModuleIHttpHandler。所有的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会根据配置文件来初始化注册的HttpModuleHttpModule在初始化时会订阅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

IHttpHandlerProcessRequest方法中对当前请求进行处理,在该方法中通过ControllerBuilder得到IControllerFactory然后通过反射的方式获取Controller的类型。

Action

ASP.NET MVC中ControllerBase是所有Controller的基类,在该类型的Execute方法中通过IActionInvokerInvokeAction方法来执行对Action的调用。在Action执行前会进行模型绑定和模型认证操作。

Filters

在ASP.NET MVC5中有常用的过滤器有5个:IAuthenticationFilterIAuthorizationFilterIActionFilterIResultFilterIExceptionFilter
在ASP.NET MVC中所有的过滤器最终都会被封装为Filter对象,该对象中FilterScope类型的属性Scopeint类型属性Order用于决定过滤器执行的先后顺序,具体规则如下:

  • OrderFilterScope的数值越小,过滤器的执行优先级越高;
  • OrderFilterScope具有更高的优先级,在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 Request Pipeline

书目推荐

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 的请求管道和运行生命周期的更多相关文章

  1. asp.net请求管道和页面生命周期

  2. Asp.net MVC进入请求管道的过程

    Asp.net MVC进入请求管道的过程 Asp.Net MVC 跟AspNet 入口解释 Asp.Net MVC请求处理过程 mvc 请求模型 mvc的原理 mvc模型 NewMVCPipleLin ...

  3. ASP.NET MVC 小牛之旅4:ASP.NET MVC的运行生命周期

    ASP.NET MVC的运行生命周期大致分成三大过程:(1)网址路由对比. (2)运行Controller与Action. (3)运行View并回传结果. 4.1网址路由对比 当iis收到http请求 ...

  4. ASP.NET整理:Cookie,Application,Session,页面生命周期

    一.设置Cookie的2种方式 1.    Repsonse.Cookie[“名”] = 值; 2.    HttpCookie hcCookie = new HttpCookie(“名”,值); h ...

  5. 【转载】ASP.NET线程安全与静态变量的生命周期浅谈

    ASP.NET线程安全所涉及的是什么呢?让我们先来看看静态变量的生命周期问题,下面是我理解的静态变量的生命周期: void Application_Start开始 void Application_E ...

  6. laravel请求到响应的生命周期

    请求到响应的核个执行过程,主要可以归纳为四个阶段,即程序启动准备阶段.请求实例化阶段.请求处理阶段.响应发送和程序终止阶段. public\index.php中有这么一段代码 $app = requi ...

  7. Laravel学习:请求到响应的生命周期

    Laravel请求到响应的整个执行过程,主要可以归纳为四个阶段,即程序启动准备阶段.请求实例化阶段.请求处理阶段.响应发送和程序终止阶段. 程序启动准备阶段 服务容器实例化 服务容器的实例化和基本注册 ...

  8. ASP.NET MVC5请求管道和生命周期

    请求处理管道 请求管道是一些用于处理HTTP请求的模块组合,在ASP.NET中,请求管道有两个核心组件:IHttpModule和IHttpHandler.所有的HTTP请求都会进入IHttpHandl ...

  9. 13、ASP.NET MVC入门到精通——MVC请求管道

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 ASP.NET MVC的请求管道和ASP.NET请求管道基本上一模一样,如果你对ASP.NET请求管道十分熟悉的话,你只要关注一下不同点.看 ...

随机推荐

  1. Day5前端学习之路——盒模型和浮动

    盒子模型 浮动float 一.盒子模型 (1)content内容区 width和height是框内容显示的区域——包括框内的文本内容,以及表示嵌套子元素的其他框,也可以使用min-width.max- ...

  2. Spark存储介绍

    目录 整体架构 存储相关类 应用启动时 增删改后更新元数据 获取数据存放位置 数据块的删除 RDD存储调用 数据读取 数据写入 cache & checkpoint Reference 记录一 ...

  3. dict的使用

    Python字典是可变类型数据,可以存储任意对象,如字符串,数字,元组,列表等. 字典的创键 字典有键key和值value组成,使用键值对链接:,字典也称为关联数组或哈希表. dict_person ...

  4. Maven 父子工程的一些细节

    Project,项目,也叫做工程. 父子工程中,子模块会自动继承父工程的资源.依赖,但子模块之间是独立的,不能直接访问彼此中的资源.类. 就是说我们可以把多个子模块都要用的资源.依赖提出来,放到父工程 ...

  5. mysql简单备份与恢复

    1.备份 mysqldump -u root -h 127.0.0.1 -p --set-gtid-purged=OFF  abc > /data/mysqlBak/abc_20200206.s ...

  6. 《Git 从入门到体系》- 写给自己的话

    我听过的对我很有冲击力的观点是:知识不成体系就是垃圾.这个观点不一定对,但是却是给我的冲击很大. 我记得以前在咖啡馆和一个博士医生聊天,他提出了这个观点:知识不成体系就是垃圾.听了这个观点我很想反驳他 ...

  7. Python 编程入门(3):算术和表达式

    以下所有例子都基于最新版本的 Python,为了便于消化,每一篇都尽量短小精悍,希望你能尽力去掌握 Python 编程的「概念」,可以的话去动手试一下这些例子(就算目前还没完全搞懂),加深理解. 计算 ...

  8. ts中的泛型

    /** * 泛型:软件工程中,我们不仅要创造定义良好的API,同时也要考虑可重用行,组件不仅能 * 够支持当前的数据类型,同时也能够支持未来数据类型. * 通俗理解:泛型就是解决类.接口.方法的复用性 ...

  9. mutations.js文件书写规范及模板调用此文件书写方法

    1)mutations.js代码如下 const mutations={ add(state){ state.count++ }, reduce(state){ state.count-- } } 2 ...

  10. XmlDocument vs XElement

    var xmlstr = @"<xml> <AppId>some_appid</AppId> <CreateTime>1413192605&l ...