原文 http://blog.csdn.net/wulex/article/details/41514795

  1. 当一个asp.net mvc应用程序提出请求,为了响应请求,包含一些请求执行流程步骤! asp.net mvc应用程序Http requestHttp response 过程中,主要包含8个步骤:
  2. RouteTable(路由表)的创建
  3. UrlRoutingModule 请求拦截
  4. Routing engine 确定route
  5. route handler 创建相关的IHttpHandler实例
  6. IHttpHandler实例确定Controller(控制器)
  7. Controller执行
  8. )一个视图引擎创建
  9. ) 视图呈现
  10. 主要流程图如下:
  11.  
  12. RouteTable的创建
  13. RouteTable的创建发生在mvc应用程序的启动 或者web应用程序池的重启!通常的asp.NET程序,一个页面请求对应磁盘上的一个页面!如(http://localhost/index.aspx
  14. 对应到服务器磁盘上的文件index.aspxindex.aspx实际上是一个类,由IHttpHandler创建实例化。IHttpHandler包含一个
  15. ProcessRequest方法,负责响应页面输出!
  16. 但是mvc application 是不同的,每一个请求映射到route,route 定义在route table,在应用程序启动时创建!
  17. RouteTable的在应用程序的具体使用如下
  18.  
  19. 代码
  20. public class MvcApplication : System.Web.HttpApplication
  21. {
  22. public static void RegisterRoutes(RouteCollection routes)
  23. {
  24. routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
  25.  
  26. routes.MapRoute(
  27. "Default", // Route name
  28. "{controller}/{action}/{id}", // URL with parameters
  29. new { controller = "Home", action = "Index", id = "" } // Parameter defaults
  30. );
  31. routes.MapRoute(
  32. "Account", // Route name
  33. "{controller}/{action}/{id}", // URL with parameters
  34. new { controller = "Account", action = "LogOn", id = "" } // Parameter defaults
  35. );
  36.  
  37. }
  38.  
  39. protected void Application_Start()
  40. {
  41. RegisterRoutes(RouteTable.Routes);
  42. }
  43. }
  44.  
  45. UrlRoutingModule 请求拦截
  46. 每一个Http 请求 都被UrlRoutingModule拦截,UrlRoutingModule提供了当前的HttpContextrouting engine(路由引擎)。HttpContext实例包含当前请求的所有数据。UrlRoutingModule控制着routing engine,提供了HttpContext数据到routing engine! UrlRoutingModule实现了IHttpModule接口,在web.config 文件进行了注册!
  47. UrlRoutingModule 具体的数据结构如下:
  48.  
  49. 代码
  50.  
  51. public class UrlRoutingModule : IHttpModule
  52. {
  53. // 主要的 Methods
  54. protected virtual void Init(HttpApplication application);
  55. private void OnApplicationPostMapRequestHandler(object sender, EventArgs e);
  56. private void OnApplicationPostResolveRequestCache(object sender, EventArgs e);
  57. public virtual void PostMapRequestHandler(HttpContextBase context);
  58. public virtual void PostResolveRequestCache(HttpContextBase context);
  59. void IHttpModule.Init(HttpApplication application);
  60.  
  61. // Properties
  62. public RouteCollection RouteCollection { get; set; }
  63.  
  64. }
  65. UrlRoutingModule WebConfig的注册
  66. <httpModules>
  67. <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule,
  68. System.Web.Routing, Version=3.5.0.0,
  69. Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
  70. </httpModules>
  71.  
  72. Routing engine 确定route
  73. routing engine基于当前HttpContext确定Route的处理。routing engine 指出route table里面匹配的route ,并在IRouteHandler实例创建route处理!
  74.  
  75. route handler 创建相关的IHttpHandler实例
  76. route table里,每一个route 都与一个IHttpHandler对应。IHttpHandler基于当前的HttpContext数据负责创建一个Controller(控制器)!IHttpHandler是由当前活动的IRouteHandlerGetHttpHandler所创建!
  77. 具体的细节如下
  78.  
  79. public interface IRouteHandler
  80. {
  81. // Methods
  82. IHttpHandler GetHttpHandler(RequestContext requestContext);
  83. }
  84.  
  85. IHttpHandler实例确定Controller(控制器)
  86. MVC应用程序中,MvcHandler实现了IHttpHandlerController实例,是基于所输入的HttpContext Url参数与route 对应的,ControllerFactory 创建一个controllerControllerContext包含上下文数据,传入到controllerExcute方法,触发controller的逻辑处理!
  87. MvcHandler主要有一个ControllerBuilder _controllerBuilder字段;
  88. 具体细节如下
  89.  
  90. 代码
  91. public class MvcHandler : IHttpAsyncHandler, IHttpHandler, IRequiresSessionState
  92. {
  93. // 主要的Fields
  94. private ControllerBuilder _controllerBuilder;
  95. }
  96. ControllerBuilder类主要有一个方法GetControllerFactory
  97. public class ControllerBuilder
  98. {
  99. public IControllerFactory GetControllerFactory();
  100. }
  101.  
  102. 通过实现IControllerFactory 工厂 创建一个Controller
  103.  
  104. Controller执行
  105. 所有的controller 逻辑调用执行时,actions请求被执行!当controller的逻辑被执行时,会返回一个ActionResult。一个ActionResult实例,会触发呈现一个View(视图),当触发发生时,一个视图引擎被创建,进行进一步的处理
  106.  
  107. )一个视图引擎创建
  108. 视图引擎实例会创建一个IView接口实例,返回一个ViewEngineResult实例,
  109.  
  110. ) 视图呈现
  111. IView实例编译请求视图,提供Render方法调用的数据!

mvc 请求处理管道的更多相关文章

  1. ASP.NET MVC请求处理管道生命周期的19个关键环节(1-6)

    ASP.NET和ASP.NET MVC的HttpApplication请求处理管道有共同的部分和不同之处,本系列将体验ASP.NET MVC请求处理管道生命周期的19个关键环节. ①以IIS6.0为例 ...

  2. ASP.NET MVC请求处理管道生命周期的19个关键环节(7-12)

    在上一篇"ASP.NET MVC请求处理管道生命周期的19个关键环节(1-6) ",体验了1-6关键环节,本篇继续. ⑦根据IsapiWorkerRequest对象,HttpRun ...

  3. ASP.NET MVC请求处理管道生命周期的19个关键环节(13-19)

    在上一篇"ASP.NET MVC请求处理管道生命周期的19个关键环节(7-12) ",体验了7-12关键环节,本篇继续. ⒀当请求到达UrlRoutingModule的时候,Url ...

  4. ASP.Net请求处理机制初步探索之旅 - Part 5 ASP.Net MVC请求处理流程

    好听的歌 我一直觉得看一篇文章再听一首好听的歌,真是种享受.于是,我在这里嵌入一首好听的歌,当然你觉得不想听的话可以点击停止,歌曲 from 王菲 <梦中人>: --> 开篇:上一篇 ...

  5. ASP.Net MVC请求处理流程

    ASP.Net MVC请求处理流程 好听的歌 我一直觉得看一篇文章再听一首好听的歌,真是种享受.于是,我在这里嵌入一首好听的歌,当然你觉得不想听的话可以点击停止,歌曲 from 王菲 <梦中人& ...

  6. 学习ASP.NET Core,怎能不了解请求处理管道[1]: 中间件究竟是个什么东西?

    ASP.NET Core管道虽然在结构组成上显得非常简单,但是在具体实现上却涉及到太多的对象,所以我们在 "通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流 ...

  7. Laravel 5.3 请求处理管道详解

    对于一个Web应用来说,在一个请求真正处理前,我们可能会对请求做各种各样的判断,然后才允许后续处理. 我们通常的做法: Script 01.php Script 02.php 优点:直观,容易理解 缺 ...

  8. MVC5-2 MVC的管道流与路由

    自定义Modue与Hander 之前讲了管道流中的Module与Hndler.现在我们可以去自定义Module和Handler Module 其实很简单,一共需要三个步骤 定义一个类去继承IHttpM ...

  9. asp.net mvc 请求处理流程,记录一下。

    asp.net mvc 请求处理流程,记录一下.

随机推荐

  1. Mysql问题随记

    [用户创建并授权远程访问] CREATE USER 'username'@'host' IDENTIFIED BY 'password’;   @后面跟主机地址,即这个用户可以从哪些地址访问数据库,l ...

  2. android 命名规则

    包名结构: 资源命名方式:

  3. oracle job SYSDATE

    hr BEGIN SYS.DBMS_JOB.REMOVE(); COMMIT; END; / DECLARE X NUMBER; BEGIN SYS.DBMS_JOB.SUBMIT ( job =&g ...

  4. DataSet、DataTable转换List(泛型集合与DataSet互相转换 )

    using System.Data; using System.Reflection; using System.Collections; using System.Collections.Gener ...

  5. 【HDU5391】Zball in Tina Town

    [题目大意] 一个球初始体积为1,一天天变大,第一天变大1倍,第二天变大2倍,第n天变大n倍.问当第 n-1天的时候,体积变为多少.注意答案对n取模. [题解] 根据威尔逊定理:(n-1)! mod ...

  6. Android中dp、dpi与px的关系

    转自知乎用户的回答: 1. dpi是dot per inch,每英寸多少点,ppi是 Pixel per inch,每英寸像素数,针对显示器的设计时,dpi=ppi.ppi计算方法是长宽各自平方之和开 ...

  7. 32.GROUP BY

    合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句. GROUP BY 语句 GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组. SQL GROUP BY 语法 ...

  8. LIRE教程之源码分析 | LIRE Tutorial of Analysis of the Source Code

    LIRE教程之源码分析 |LIRE Tutorial of Analysis of the Source Code 最近在做地理图像识别和检索的研究,发现了一个很好用的框架LIRE,遂研究了一通.网上 ...

  9. MongoDB整理笔记のReplica Sets

    MongoDB支持在多个机器中通过异步复制达到故障转移和实现冗余.多机器中同一时刻只有一台机器是用于写操作,正因为如此,MongoDB提供了数据一致性的保障.而担当primary角色的机器,可以把读的 ...

  10. 观察者(Observer)模式 * 委托事件

    观察者(Observer)模式:定义了一种一对多的依赖关系.让多个观察者对象同时监听某一个主题对象.   这个主题对象发生变化时会通知所有观察者对象,使他们字段更新自己 /* * 抽象主题(Subje ...