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

请求处理管道

请求管道是一些用于处理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运行时接管之后,HttpRuntime会利用HttpApplicationFactory创建或从HttpApplication对象池(.NET中类似的机制有线程池和字符串拘留池)中取出一个HttpApplication对象,同时ASP.NET会根据配置文件来初始化注册的HttpModuleHttpModule在初始化时会订阅HttpApplication中的事件来实现对HTTP请求的处理。

在ASP.NET MVC5中,Global.asax文件中定义了MvcApplication类,继承自HttpApplication类:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        RouteTable.Routes.Add("xfhHandler", new Route(
           "{controller}/{action}",
            new RouteValueDictionary(new Dictionary<string, object>() { ["controller"] = "home", ["action"] = "index" }),
            new XfhUrlRouteHandler())
        );

        //RouteConfig.RegisterRoutes(RouteTable.Routes);
    }
}

Application_Start()方法最先执行,一般在该方法中添加一些配置,如路由注册、全局过滤器的注册等。

Route

一个HTTP请求会经过至少一个HttpModule的处理。UrlRoutingModule是非常重要的模块,它是路由系统的核心。路由系统的职责是从请求URL中获取controller和action的名称以及其它请求数据。
UrlRoutingModule根据当前请求的URL和RouteTable中已注册的路由模板进行匹配并返回第一个和当前请求相匹配的路有对象Route,然后根据路有对象获取路由数据对象RouteData(ASP.NET MVC中,路由数据必须包含controller和action的名称),再有RouteData获取IRouteHandler最终有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属性值相同时才会被考虑
//数值越小,执行优先级越高
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 Interview Questions and Answers Book》
《ASP.NET MVC5框架揭秘》

参考文章

IIS 7.0 的 ASP.NET 应用程序生命周期概述
The IIS7 Integrated Pipeline

版权声明

本文为作者原创,版权归作者雪飞鸿所有。 转载必须保留文章的完整性,且在页面明显位置处标明原文链接

如有问题, 请发送邮件和作者联系。

时间: 2024-12-22 11:14:58

ASP.NET MVC5请求管道和生命周期的相关文章

【译】ASP.NET应用程序和页面生命周期

为何翻译此文 一.此文是Code Project社区2010年4月ASP.NET板块的最佳文章,说明了此文的份量: 二.锻炼自己的英文技术文章翻译能力,提高英文技术文档阅读能力: 三.了解掌握ASP.NET页面生命周期是非常必要的,这有助于我们更加灵活的控制页面,以我们需要的方式编程开发: 关于原文作者 原文作者:Shivprasad koirala 原文地址:http://www.codeproject.com/Articles/73728/ASP-NET-Application-and-Pa

ASP.NET管线与应用程序生命周期

ASP.NET管线与应用程序生命周期 ASP.NET管线与应用程序生命周期 8.1节介绍了IIS的系统架构和HTTP请求处理的总体流程,从中可以知道每个ASP.NET网站都对应着一个Web应用程序,此Web应用程序可以响应HTTP请求,为用户提供所需的信息.那么,ASP.NET应用程序具体是如何响应HTTP请求的?包括哪些具体的处理流程?这涉及到ASP.NET应用程序的生命周期问题. 8.2.1 ASP.NET应用程序生命周期* 本节以IIS 6为例分步介绍ASP.NET应用程序处理HTTP请求

ASP.NET的WEB页面的生命周期

ASP.NET的WEB页面的生命周期,从生成到销毁,也经历了不同的阶段和过程.对于ASP.NET页面生命周期中将执行一些列处理步骤.这些步骤包括初始化.实例化控件.还原和维护状态.运行时间处理程序代码及呈现.一般来说,也要经历如下各个阶段1.页请求:页请求发生在页面生命周期开始之前,用户请求页时,ASP.NET将确定是否需要分析和编译页2.开始:在开始阶段,将设置页属性,如Request和Response.在此阶段,页还将确定请求是回发请求还是新请求,并设置IsPostBack属性3.页初始化:

ASP.NET应用程序与页面生命周期

在本文中,我们将了解不同的事件,ASP.NET 应用程序的生命周期以浏览器向 Web 服务器(对于 ASP.NET 应用程序,通常为 IIS)发送请求为起点,直至将请求结果返回至浏览器结束.在这个过程中,首先我们需要了解ASP.NET请求的2个大致的步骤.其次我们将详细了解 'httphandler ',' httpmodule和 asp.net 页面对象(Page)中不同的事件的执行顺序,逻辑. 二个步骤的过程:asp.net请求处理,2步的过程如下所示,用户发送一个请求到IIS 服务器: 1

ASP.NET学习笔记——webform页面生命周期

webform运行原理 运行原理相同点:aspx和ashx运行机制差不多. 运行原理不同点: 1.执行事件管道的时候,在7,8个事件之间创建的是前台页面类对象,那后台类是什么时候创建的呢?由于aspx前台页面继承自后台,所以创建前台页面类时,后台就创建好了. 2.在第11.12事件之间,调用存放在remapHandler中的前台页面类对象的processRequest方法,会进行复杂的处理,也就是走页面生命周期. webform页面生命周期 1.通过反编译,查看前台类代码 前台代码P01Inde

asp.net MVC 应用程序的生命周期(上)

首先我们知道http是一种无状态的请求,他的生命周期就是从客户端浏览器发出请求开始,到得到响应结束.那么MVC应用程序从发出请求到获得响应,都做了些什么呢? 本文我们会详细讨论MVC应用程序一个请求的生命周期,从一个控件到另一个控件是怎样被处理的.我们还会详细介绍一下整个请求的生命周期中,用到的相关组件.因为在平常的开发过程中,我们可能知道怎样去使用MVC框架来处理相关的请求,大部分的时候我们只是在controller和action方法之间做相关的处理,对于真正内在的运行机制可能不是很了解.其实

[转] ASP.NET应用程序与页面生命周期

在本文中,我们将了解不同的事件,ASP.NET 应用程序的生命周期以浏览器向 Web 服务器(对于 ASP.NET 应用程序,通常为 IIS)发送请求为起点,直至将请求结果返回至浏览器结束.在这个过程中,首先我们需要了解ASP.NET请求的2个大致的步骤.其次我们将详细了解 'httphandler ',' httpmodule和 asp.net 页面对象(Page)中不同的事件的执行顺序,逻辑. 二个步骤的过程: asp.net请求处理,2步的过程如下所示,用户发送一个请求到IIS 服务器:

asp.net MVC 应用程序的生命周期

首先我们知道http是一种无状态的请求,他的生命周期就是发出请求开始,到得到响应结束.那么MVC应用程序从发出请求到获得响应,都做了些什么呢? 本文我们会详细讨论MVC应用程序的生命周期和一个请求,从一个控件到另一个控件是怎样被处理的.我们还会详细介绍一下整个请求的生命周期中,用到的相关组件.在平常的开发过程中,我们可能知道怎样去使用MVC框架来处理相关的请求,大部分的时候我们只是在controller和action方法之间做相关的处理. 当我最开始学习使用mvc的时候,困扰我的一个问题就是,一

python---django请求-响应的生命周期(FBV和CBV含义)

Django请求的生命周期是指:当用户在访问该url路径是,在服务器Django后台都发生了什么. 客户端发送Http请求给服务端,Http请求是一堆字符串,其内容是: 访问:http://crm.oldboy.com:8080/login.html,客户端发送Http请求 1.路由映射,匹配路由(从上到下,匹配到就停止),对应相应views中的业务函数 url(r'^login.html', views.login), 2.匹配成功后,执行views下的对应函数:(FBV) def login