先来熟悉下asp.net请求管道
1.当客户端发送http://localhost:80/home/index请求时
2.首先到达服务端的内核模块HTTP.SYS(它监听80端口),通过访问注册表,将请求转交给IIS处理
3.IIS中w3svc服务访问IIS核心进程InetInfo.exe中元数据信息,获取请求交给哪个具体的WorkProcess进行处理 (IIS6中有多个WorkProcess工作进程 它是.Net代码执行所在的宿主)
5.具体的WorkProcess将请求交给aspnet_isapi.dll(非托管的Com组件 它负责启动.net运行时 将请求信息交给运行时ISAPIRuntime)
6.ISAPIRuntime的PR方法通过ECB指针创建HttpWorkProcess对象 传入HttpRuntime中
7.HttpRuntime的PR方法通过HttpWorkProcess对象 封装出HttpContext对象(包含HttpRequest HttpResponse Session...)
8.再通过HttpApplicationFactory获取HttpApplication实例
    如果是第一次请求,做两件事
      1.会编译Global.asax成HttpApplication类型  创建特殊应用程序池 调用池中特殊Application对象的Application_Start方法
    2.从池子中获取一个普通的HttpApplication实例 如果池子是空的 则通过Global.asax反射得到(MVC中得到的就是MVCApplication),同时调用HttpApplication实例的Init()方法,方法内部初始化所有的HttpMoudle(配置文件中所有HttpMoudle)UrlRouteMoudlue在此时初始化
说这么多您可能不理解 我们通过Reflect反编译看下源码的执行过程 如下图:
 
  • 路由模块对象以及路由注册、路由数据获取

上述有个要点需要重复下,就是Application_Start方法中路由的注册
这里就扯到MVC的路由了,下图阐述路由模块锁涉及的几大对象以及Application_Start方法中进行的路由注册,同时简要说明RouteTable是如何通过请求地址获得最终的RouteData路由数据的
 
  • UrlRouteMoudle内部

在接下来看看UrlRouteMoudle的Init方法中究竟做了些什么?它是如何将原本的请求处理Handler"转交"给MvcHandler的
源码如下:
public class UrlRoutingModule : IHttpModule {
public void Dispose() {
}
public void Init(HttpApplication context) {
context.PostResolveRequestCache += OnPostResolveRequestCache;
}
protected virtual void OnPostResolveRequestCache(object sender, EventArgs e) {
//封装当前上下文至HttpContextWrapper中
HttpContextWrapper httpContext = new HttpContextWrapper(HttpContext.Current);
//根据上下文信息 从路由表RouteTable 中的路由集合RouteCollection 获取路由数据RouteData
//RouteTable数据在Application_Start中填充
RouteData routeData = RouteTable.Routes.GetRouteData(httpContext);
if(null == routeData) {//如果路由数据不存在
return;
}
//将传入的HttpContextWrapper上下文信息与路由数据封装至新的RequestContext上下文 供后续RouteHandler使用
RequestContext requestContext = new RequestContext {
RouteData = routeData,
HttpContext = httpContext
};
//路由数据 通过 RouteHandler 获取真正处理请求的IHttpHandler对象 ->实质就是MvcHandler对象
IHttpHandler handler = routeData.RouteHandler.GetHttpHandler(requestContext);
//将原始请求 重定向到当前的IHttpHandler上 (从原有WebForm中的IHttpHandler切至MvcHandler)
httpContext.RemapHandler(handler);
}
}
图析如下:

  • MVCHandler

接下来无疑是进入MVCHandler的具体处理了,如何创建控制器,控制器如何执行方法... 这方面没有深入的了解,只知道个大概,
通过ControllerFactory创建Controller,
通过ExecuteResult获取执行结果
通过Render渲染视图
完整流程图如下:
 
 
 

原文来自 痞子一毛  Asp.Net MVC请求处理图解一文

ASP.NET MVC生命周期与管道模型的更多相关文章

  1. ASP.NET MVC生命周期介绍(转)

    本文以IIS7中asp.net应用程序生命周期为例,介绍了asp.net mvc的生命周期. asp.net应用程序管道处理用户请求时特别强调"时机",对asp.net生命周期的了 ...

  2. ASP.NET MVC 生命周期

    本文的目的旨在详细描述ASP.NET MVC请求从开始到结束的每一个过程.我希望能理解在浏览器输入URL并敲击回车来请求一个ASP.NET MVC网站的页面之后发生的任何事情. 为什么需要关心这些?有 ...

  3. Asp.net MVC生命周期

    Asp.net应用程序管道处理用户请求时特别强调"时机",对Asp.net生命周期的了解多少直接影响我们写页面和控件的效率.因此在2007年和2008年我在这个话题上各写了一篇文章 ...

  4. MVC学习笔记---MVC生命周期及管道

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

  5. [收藏]Asp.net MVC生命周期

    一个HTTP请求从IIS移交到Asp.net运行时,Asp.net MVC是在什么时机获得了控制权并对请求进行处理呢?处理过程又是怎样的? 以IIS7中asp.net应用程序生命周期为例,下图是来自M ...

  6. 1.3 ASP.NET MVC生命周期

    ASP.NET MVC的执行生命周期主要分为三个阶段,分别是网址路由对比.执行控制器与动作.执行视图并返回结果.从ASP.NET MVC接受HTTP请求到返回HTTP响应的过程如下图所示.

  7. asp.net mvc生命周期学习

    ASP.NET MVC是一个扩展性非常强的框架,探究其生命周期对用Mock框架来模拟某些东西,达到单元测试效果,和开发扩展我们的程序是很好的. 生命周期1:创建routetable.把URL映射到ha ...

  8. asp.net页面生命周期请求管道19个事件

    HttpContext: ecb→ HttpWorkerRequest→HttpContext HttpApplicationFactory.获取了HttpApplication实例之后. (1)Be ...

  9. 从Asp .net到Asp core (第一篇)《回顾Asp .net生命周期与管道机制》

    从2016年微软收购了Xamarin整合到Visual Studio里并将其开源到现在已有三年多时间,从.net core 1.0 到现在的2.2,以及即将问世的3.0,我们看到微软正在跨平台之路越走 ...

随机推荐

  1. drop大表

    删除大表: .给对应表的ibd文件建立硬链接,因为表的数据和索引都在该文件中. ln /home/work/status.ibd /home/work/status.ibd.hdlk .主库上删除表, ...

  2. QT安装以及使用(QT支持linux和windows,也支持C/C++代码的编译运行,比vs简洁多)

    Windows: 0. QT Versionqt-win-opensource-4.7.4-mingwqt-creator-win-opensource-2.4.1 1. 系统Windows 7 &a ...

  3. 汽车超人CEO郑超:不惧资本寒冬 融资已增至57亿

    汽车超人CEO郑超:不惧资本寒冬 融资已增至57亿 来源:互联网 时间:2017-06-01 阅读:3次     篇一 : 汽车超人CEO郑超:不惧资本寒冬 融资已增至57亿 近日记者获悉,金固股份旗 ...

  4. VS2010-MFC(文档、视图和框架:概述)

    转自:http://www.jizhuomi.com/software/221.html 前面几节讲了菜单.工具栏和状态栏的使用,本节开始将为大家讲解文档.视图和框架的知识. 文档.视图和框架简介 在 ...

  5. day23_5_练习_Calculator_使用正则表达式计算复杂表达式

    #!/usr/bin/env python# -*- coding:utf-8 -*-# ------------------------------------------------------- ...

  6. poj-3468-A Simple Problem with Integers-线段树入门+区间更新

    You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of op ...

  7. HTTP协议响应篇

    http响应的基本介绍 一个HTTP响应代表服务器向客户端回送的数据, 由三个部分构成 状态行[200 , 302 304, 403, 404, 500] 响应消息头 返回的实体内容 http响应状态 ...

  8. 深入分析Service启动、绑定过程

    Service是Android中一个重要的组件,它没有用户界面,可以运行在后太做一些耗时操作.Service可以被其他组件启动,甚至当用户切换到其他应用时,它仍然可以在后台保存运行.Service 是 ...

  9. 清晰化算法在DSP上的实现

    清晰化算法在DSP TIDM642上的实现,之前的部分工作摘要于此. 1 DSP平台的选择 1.1 DM642 Evolution Module 选择现有的DM642 Evolution Module ...

  10. windows系统下jupyter notebook使用虚拟环境

    目录 [亲测好使]windows系统下jupyter notebook使用虚拟环境 在虚拟环境中安装jupyter,并添加到jupyter kernel 参考 [未测试,但觉得比上面那方法好,因为上面 ...