先来熟悉下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. 【转载】C# 开源库大全非常好

    原文地址:http://m.blog.csdn.net/woddle/article/details/37311877 C#开源大全 商业协作和项目管理平台-TeamLab 网络视频会议软件-VMuk ...

  2. (转)protobuf-----Mac 机器安装

    转自: https://blog.csdn.net/u014534808/article/details/80203018 安装之旅 1. 下载protobufprotobuf下载页面 在此页面选择合 ...

  3. EXCEL表格链接SQLSEVER数据库

    Sub 数据库连接()     Set Cnn = CreateObject("ADODB.Connection")    Set rs = CreateObject(" ...

  4. kaptcha 实现验证码

    依赖 <dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha< ...

  5. VS2008编译出现问题:error C2485: “__restrict”: 无法识别的扩展属性 解决办法

    错误:Error3 error C2485: '__restrict' : unrecognized extended attribute f:\program files\microsoft vis ...

  6. 精度试验结果报告Sleep, GetTickCount, timeGetTime, QueryPerformanceCounter

    一段简单的代码来实现精度试验 int main() {       // 初始化代码       ......       int i = 0;       while(i++ < 1000) ...

  7. 如何用excel统计调查问卷

    如何用excel统计调查问卷 有些人可能经常要对调查问卷进行统计,使用手写的方法(就是在纸上写正字的方法)虽然很方便,不过不方便在一定条件下进行统计,如在男士的条件下,使用诺基亚的手机有多少人.而用e ...

  8. 非常棒的java在线编译平台

    1.godingground https://www.tutorialspoint.com/compile_java_online.php 2.ideone.com 3.jdoodle在线Java编译 ...

  9. 19.SimLogin_case08

    # 模拟登录微博 import time import base64 import rsa import binascii import requests import re import rando ...

  10. [AHOI2014/JSOI2014]骑士游戏

    题目 思博贪心题写了一个半小时没救了,我也没看出这是一个\(spfa\)来啊 设\(dp_i\)表示彻底干掉第\(i\)只怪物的最小花费,一个非常显然的事情,就是对于\(k_i\)值最小的怪物满足\( ...