mvc 请求处理管道
原文 http://blog.csdn.net/wulex/article/details/41514795
- 当一个asp.net mvc应用程序提出请求,为了响应请求,包含一些请求执行流程步骤! 在asp.net mvc应用程序Http request和Http response 过程中,主要包含8个步骤:
- )RouteTable(路由表)的创建
- )UrlRoutingModule 请求拦截
- )Routing engine 确定route
- )route handler 创建相关的IHttpHandler实例
- )IHttpHandler实例确定Controller(控制器)
- )Controller执行
- )一个视图引擎创建
- ) 视图呈现
- 主要流程图如下:
- )RouteTable的创建
- RouteTable的创建发生在mvc应用程序的启动 或者web应用程序池的重启!通常的asp.NET程序,一个页面请求对应磁盘上的一个页面!如(http://localhost/index.aspx
- 对应到服务器磁盘上的文件index.aspx)index.aspx实际上是一个类,由IHttpHandler创建实例化。IHttpHandler包含一个
- ProcessRequest方法,负责响应页面输出!
- 但是mvc application 是不同的,每一个请求映射到route,route 定义在route table,在应用程序启动时创建!
- RouteTable的在应用程序的具体使用如下
- 代码
- public class MvcApplication : System.Web.HttpApplication
- {
- public static void RegisterRoutes(RouteCollection routes)
- {
- routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
- routes.MapRoute(
- "Default", // Route name
- "{controller}/{action}/{id}", // URL with parameters
- new { controller = "Home", action = "Index", id = "" } // Parameter defaults
- );
- routes.MapRoute(
- "Account", // Route name
- "{controller}/{action}/{id}", // URL with parameters
- new { controller = "Account", action = "LogOn", id = "" } // Parameter defaults
- );
- }
- protected void Application_Start()
- {
- RegisterRoutes(RouteTable.Routes);
- }
- }
- )UrlRoutingModule 请求拦截
- 每一个Http 请求 都被UrlRoutingModule拦截,UrlRoutingModule提供了当前的HttpContext的routing engine(路由引擎)。HttpContext实例包含当前请求的所有数据。UrlRoutingModule控制着routing engine,提供了HttpContext数据到routing engine! UrlRoutingModule实现了IHttpModule接口,在web.config 文件进行了注册!
- UrlRoutingModule 具体的数据结构如下:
- 代码
- public class UrlRoutingModule : IHttpModule
- {
- // 主要的 Methods
- protected virtual void Init(HttpApplication application);
- private void OnApplicationPostMapRequestHandler(object sender, EventArgs e);
- private void OnApplicationPostResolveRequestCache(object sender, EventArgs e);
- public virtual void PostMapRequestHandler(HttpContextBase context);
- public virtual void PostResolveRequestCache(HttpContextBase context);
- void IHttpModule.Init(HttpApplication application);
- // Properties
- public RouteCollection RouteCollection { get; set; }
- }
- UrlRoutingModule 在WebConfig的注册
- <httpModules>
- <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule,
- System.Web.Routing, Version=3.5.0.0,
- Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
- </httpModules>
- )Routing engine 确定route
- routing engine基于当前HttpContext确定Route的处理。routing engine 指出route table里面匹配的route ,并在IRouteHandler实例创建route处理!
- )route handler 创建相关的IHttpHandler实例
- 在route table里,每一个route 都与一个IHttpHandler对应。IHttpHandler基于当前的HttpContext数据负责创建一个Controller(控制器)!IHttpHandler是由当前活动的IRouteHandler的GetHttpHandler所创建!
- 具体的细节如下
- public interface IRouteHandler
- {
- // Methods
- IHttpHandler GetHttpHandler(RequestContext requestContext);
- }
- )IHttpHandler实例确定Controller(控制器)
- 在MVC应用程序中,MvcHandler实现了IHttpHandler,Controller实例,是基于所输入的HttpContext 和Url参数与route 对应的,ControllerFactory 创建一个controller,ControllerContext包含上下文数据,传入到controller的Excute方法,触发controller的逻辑处理!
- MvcHandler主要有一个ControllerBuilder _controllerBuilder字段;
- 具体细节如下
- 代码
- public class MvcHandler : IHttpAsyncHandler, IHttpHandler, IRequiresSessionState
- {
- // 主要的Fields
- private ControllerBuilder _controllerBuilder;
- }
- ControllerBuilder类主要有一个方法GetControllerFactory
- public class ControllerBuilder
- {
- public IControllerFactory GetControllerFactory();
- }
- 通过实现IControllerFactory 工厂 创建一个Controller
- )Controller执行
- 所有的controller 逻辑调用执行时,actions请求被执行!当controller的逻辑被执行时,会返回一个ActionResult。一个ActionResult实例,会触发呈现一个View(视图),当触发发生时,一个视图引擎被创建,进行进一步的处理
- )一个视图引擎创建
- 视图引擎实例会创建一个IView接口实例,返回一个ViewEngineResult实例,
- ) 视图呈现
- IView实例编译请求视图,提供Render方法调用的数据!
mvc 请求处理管道的更多相关文章
- ASP.NET MVC请求处理管道生命周期的19个关键环节(1-6)
ASP.NET和ASP.NET MVC的HttpApplication请求处理管道有共同的部分和不同之处,本系列将体验ASP.NET MVC请求处理管道生命周期的19个关键环节. ①以IIS6.0为例 ...
- ASP.NET MVC请求处理管道生命周期的19个关键环节(7-12)
在上一篇"ASP.NET MVC请求处理管道生命周期的19个关键环节(1-6) ",体验了1-6关键环节,本篇继续. ⑦根据IsapiWorkerRequest对象,HttpRun ...
- ASP.NET MVC请求处理管道生命周期的19个关键环节(13-19)
在上一篇"ASP.NET MVC请求处理管道生命周期的19个关键环节(7-12) ",体验了7-12关键环节,本篇继续. ⒀当请求到达UrlRoutingModule的时候,Url ...
- ASP.Net请求处理机制初步探索之旅 - Part 5 ASP.Net MVC请求处理流程
好听的歌 我一直觉得看一篇文章再听一首好听的歌,真是种享受.于是,我在这里嵌入一首好听的歌,当然你觉得不想听的话可以点击停止,歌曲 from 王菲 <梦中人>: --> 开篇:上一篇 ...
- ASP.Net MVC请求处理流程
ASP.Net MVC请求处理流程 好听的歌 我一直觉得看一篇文章再听一首好听的歌,真是种享受.于是,我在这里嵌入一首好听的歌,当然你觉得不想听的话可以点击停止,歌曲 from 王菲 <梦中人& ...
- 学习ASP.NET Core,怎能不了解请求处理管道[1]: 中间件究竟是个什么东西?
ASP.NET Core管道虽然在结构组成上显得非常简单,但是在具体实现上却涉及到太多的对象,所以我们在 "通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流 ...
- Laravel 5.3 请求处理管道详解
对于一个Web应用来说,在一个请求真正处理前,我们可能会对请求做各种各样的判断,然后才允许后续处理. 我们通常的做法: Script 01.php Script 02.php 优点:直观,容易理解 缺 ...
- MVC5-2 MVC的管道流与路由
自定义Modue与Hander 之前讲了管道流中的Module与Hndler.现在我们可以去自定义Module和Handler Module 其实很简单,一共需要三个步骤 定义一个类去继承IHttpM ...
- asp.net mvc 请求处理流程,记录一下。
asp.net mvc 请求处理流程,记录一下.
随机推荐
- Mysql问题随记
[用户创建并授权远程访问] CREATE USER 'username'@'host' IDENTIFIED BY 'password’; @后面跟主机地址,即这个用户可以从哪些地址访问数据库,l ...
- android 命名规则
包名结构: 资源命名方式:
- oracle job SYSDATE
hr BEGIN SYS.DBMS_JOB.REMOVE(); COMMIT; END; / DECLARE X NUMBER; BEGIN SYS.DBMS_JOB.SUBMIT ( job =&g ...
- DataSet、DataTable转换List(泛型集合与DataSet互相转换 )
using System.Data; using System.Reflection; using System.Collections; using System.Collections.Gener ...
- 【HDU5391】Zball in Tina Town
[题目大意] 一个球初始体积为1,一天天变大,第一天变大1倍,第二天变大2倍,第n天变大n倍.问当第 n-1天的时候,体积变为多少.注意答案对n取模. [题解] 根据威尔逊定理:(n-1)! mod ...
- Android中dp、dpi与px的关系
转自知乎用户的回答: 1. dpi是dot per inch,每英寸多少点,ppi是 Pixel per inch,每英寸像素数,针对显示器的设计时,dpi=ppi.ppi计算方法是长宽各自平方之和开 ...
- 32.GROUP BY
合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句. GROUP BY 语句 GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组. SQL GROUP BY 语法 ...
- LIRE教程之源码分析 | LIRE Tutorial of Analysis of the Source Code
LIRE教程之源码分析 |LIRE Tutorial of Analysis of the Source Code 最近在做地理图像识别和检索的研究,发现了一个很好用的框架LIRE,遂研究了一通.网上 ...
- MongoDB整理笔记のReplica Sets
MongoDB支持在多个机器中通过异步复制达到故障转移和实现冗余.多机器中同一时刻只有一台机器是用于写操作,正因为如此,MongoDB提供了数据一致性的保障.而担当primary角色的机器,可以把读的 ...
- 观察者(Observer)模式 * 委托事件
观察者(Observer)模式:定义了一种一对多的依赖关系.让多个观察者对象同时监听某一个主题对象. 这个主题对象发生变化时会通知所有观察者对象,使他们字段更新自己 /* * 抽象主题(Subje ...