ASP.NET WebForm / MVC 源码分析

 

浏览器 Url:https//localhost:6565/Home/Index ,https//localhost:6565/WebForm1.aspx,请求服务器(构建请求报文,并且将请求报文发送给服务器)

1:服务器(内核模式 Http.sys)对请求报文做基本的处理

2:请求服务器(用户模式,IIS服务器)

  2.1:对发送过来的数据做一个检查,如果请求的是静态资源的(.html,jpg,js),那么IIS直接将这些资源返回浏览器

  2.2:如果是动态资源(.aspx,.ashx),IIS服务器无法直接处理,请求W3wp.exe进程(非托管模式/托管模式)

  2.3:非托管模式(aspnet_isapi.dll),加载运行时,然后将数据传递.NetFrameWork,然后进入托管模式

  (以上步骤无法通过代码验证,微软没有开源,以下步骤可以通过Reflector查看源代码)

  2.4:托管模式(ISAPIRuntime),非常重要的方法

  public int ProcessRequest(IntPtr ecb, int iWRType)  //ecb 句柄:是操作系统的概念,指的就是资源的编号,操作系统将所有的资源都加上相应的编号。

Reflector 7百度云盘:链接:http://pan.baidu.com/s/1eSm9Y06  密码:gyx0

1:用Reflector 搜索ISAPIRuntime

2:查看里面的ProcessRequest方法,根据ecb句柄创建出ISAPIWorkerRequest(封装的是请求报文最原始的数据)

3:HttpRuntime.ProcessRequstNoDemand(wr); //将HttpWorkerRequest传递到HttpRuntime中

4:ProcessRequestNow方法

5:ProcessRequestInternal方法

在HttpRuntime中创建了HttpContext(context=new HttpContext(wr,false)); //最终请求报文的数据封装到了HttpContext(HttpRequest/HttpResponse)

5.1:在HttpContext类中初始化:new HttpRequest(wr,this);//接收数据

                  new HttpResponse(wr,this);//输出数据

5.2:ProcessRequestInternal中GetApplicationInstance方法 (HttpContext类初始化之后)

创建了一个HttpApplication对象,负责处理浏览器发送过来的数据,由于请求报文的数据都封装到了HttpContext中,

那么在这里需要将HttpContext传递到HttpApplication中,HttpApplication是怎么被创建的呢?

IHttpHandler applicationInstance = HttpApplicationFactory.GetApplicationInstance(context); //是通过HttpApplicationFactory工厂创建出的HttpApplication.

在创建HttpApplication的时候,用到了HttpApplication池的应用,在创建时先看一下池中有没有空闲的HttpApplication,如果有直接拿出来用,用完以后再放入池中。

在这里这个池就是栈(stack),如果池中没有空闲的,那么就创建一个。

1:HttpApplication对象一次只能处理一个请求。这里的HttpApplication对象的生命周期只针对与动态内容的请求,静态内容IIS直接帮我们处理了。

2:而对于HttpApplication中的其它19个事件,则对于每个请求(请求动态内容)都会触发一次。

3:Application_Start是在用户第一次请求动态内容的时候触发一次(在真正的IIS中)。

Application_End在整个应用程序结束的时候,比如:重启IIS/重启网站/重启对应网站的"应用程序池",结束w3wp.exe进程的情况下。

6:查看 IHttpHandler applicationInstance = HttpApplicationFactory.GetApplicationInstance(context);

6.1  theApplicationFactory.EnsureInited();

6.2 theApplicationFactory.EnsureAppStartCalled(context);

_theApplicationFactory.EnsureAppStartCalled(context);确保Global文件中的Application_Start方法被调用,而且只调用一次。

6.3 return _theApplicationFactory.GetNormalApplicationInstance(context);

state=(HttpApplication)HttpRuntime.CreateNonPublicInstance(this._theApplicationType);

(通过反射的形式将Global文件编译的类型创建出HttpApplication)//创建HttpApplication对象

//找到Global.asax文件并且对Global.asax文件进行编译,编译出_theApplicationType,调用[_theApplicationFactory.EnsureInited();]

7: state.InitInternal(context, this._state, this._eventHandlerMethods);

8: this.InitModules();

当创建出HttpApplication以后,会遍历Web.config文件中关于HttpModule的信息,然后执行其中的Init方法。

 InitModulesCommon

接下里就要进入管道事件模型 (Application  19事件)

从HttpApplication对象创建开始,调用ProcessRequest方法,到调用结束,整个过程叫做"ASP.NET应用的生命周期"(不是ASP.NET页面的生命周期)

【处理用户请求:会触发19个事件,23步骤】

9:到达第7个事件(MVC和WebForm的区别),会通过EventHandler委托调用OnApplicationPostResolveRequestCache执行该方法中的代码。

9.1:ASP.NET WebForm

在asp.net应用程序的生命周期的第7个事件和第8个事件之间,创建了用户请求的ashx或者aspx页面的对象。

如果是aspx页面的话,在这里创建的页面的对象不是aspx对应的后台类的对象,而是aspx页面编译后生成的类的对象,该类型继承自后台代码文件。

所以创建了该类型的对象就拥有了后台代码文件中的所有东西。

【未完 待续】

9.2:ASP.NET MVC

在这里有一个非常重要的Module就是UrlRouteingModule (UrlRouteingModule中的Init方法)

在UrlRouteingModule中的Init方法中定义了:

application.PostResolveRequestCache+=new EventHandler(this.OnApplicationPostResolveRequestCache);

1:[第7~8事件之间]到达第7个事件,会通过EventHandler委托调用OnApplicationPostResolveRequestCache执行该方法中的代码

2:[第11~12事件之间] 开始执行MvcHandler中的ProcessRequest方法

ASP.NET MVC源码分析:http://www.cnblogs.com/Dr-Hao/p/5315556.html

code write the life, programe change the world

WebForm / MVC 源码分析的更多相关文章

  1. ASP.NET WebForm / MVC 源码分析

    浏览器 Url:https//localhost:6565/Home/Index ,https//localhost:6565/WebForm1.aspx,请求服务器(构建请求报文,并且将请求报文发送 ...

  2. ASP.NET MVC源码分析

    MVC4 源码分析(Visual studio 2012/2013) HttpModule中重要的UrlRoutingModule 9:this.OnApplicationPostResolveReq ...

  3. asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证

    原文:asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证 在前面的文章中我们曾经涉及到ControllerActionInvoker类GetPara ...

  4. asp.net mvc源码分析-ModelValidatorProviders 客户端的验证

    几年写过asp.net mvc源码分析-ModelValidatorProviders 当时主要是考虑mvc的流程对,客户端的验证也只是简单的提及了一下,现在我们来仔细看一下客户端的验证. 如图所示, ...

  5. ASP.NET MVC 源码分析(一)

    ASP.NET MVC 源码分析(一) 直接上图: 我们先来看Core的设计: 从项目结构来看,asp.net.mvc.core有以下目录: ActionConstraints:action限制相关 ...

  6. 精尽Spring MVC源码分析 - 寻找遗失的 web.xml

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...

  7. 精尽Spring MVC源码分析 - 调式环境搭建

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...

  8. 精尽Spring MVC源码分析 - 文章导读

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...

  9. 精尽Spring MVC源码分析 - WebApplicationContext 容器的初始化

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...

随机推荐

  1. 【ASP.NET Web API教程】3.4 HttpClient消息处理器

    原文:[ASP.NET Web API教程]3.4 HttpClient消息处理器 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. 3.4 ...

  2. PowerShell 在线教程 4

    PowerShell 在线教程 4   认识Powershell 介绍和安装 自定义控制台 快速编辑模式和标准模式 快捷键 管道和重定向 Powershell交互式 数学运算 执行外部命令 命令集 别 ...

  3. drupal进入不了后台时候的解决办法,作者使用drush方案,已验证

    drupal把正在用的主题不小心删了,怎么进后台? 方法一: 去variable表里把默认主题换了 方法二: ?q=user 登录到管理区,开启简洁连接使用user(网站根目录下面) admin/ap ...

  4. 一起talk C栗子吧(第十二回:C语言实例--单链表一)

    各位看官们,大家好.从今天開始,我们讲大型章回体科技小说 :C栗子.也就是C语言实例.闲话休提, 言归正转. 让我们一起talk C栗子吧! 看官们,上一回中咱们没有说详细的样例,并且是说了样例中的文 ...

  5. T-SQL 操作文件 具体解释

    /*******  导出到excel EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q -S" ...

  6. Webserver管理系列:5、利用MSConfig排查木马

    木马程序最喜欢去的地方有两个一个是服务里面,一个是启动里面.利用msconfig我们能够高速的找到可疑程序. 在命令行中输入msconfig回车 选择服务项: 这里面的服务有非常多我们非常难排查,我告 ...

  7. Swift - 页控件(UIPageControl)的用法

    使用页控件可以用来展示多个桌面.比如很多应用第一次登陆时,会在开始页面使用页控件来介绍功能,通过左右滑动来切换页. 通常我们使用UIPageControl和UIScrollView相互结合来实现多页切 ...

  8. 超声波模块SRF05

    //////////////////////////////////////////////////////////////////////////////// // //     PIC16F877 ...

  9. android之JSON 进行网络数据交换

    什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,同一时候也易于机器解析和生成,很适合于server与client的交互. J ...

  10. Struts 2.x仍然明显落后于时代。 Struts 2.x这一类老牌Web MVC开发框架仅能用于开发瘦客户端应用,无法用来开发对于交互体验要求更高的应用。

    后来我在工作中陆续使用过Struts 1.x和Struts 2.x.我曾经把一个开源的基于Struts 1.x的自助式广告联盟应用移植到Spring MVC,还基于Struts 2.x做过网站开发.S ...