WebForm / MVC 源码分析
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
WebForm / MVC 源码分析的更多相关文章
- ASP.NET WebForm / MVC 源码分析
浏览器 Url:https//localhost:6565/Home/Index ,https//localhost:6565/WebForm1.aspx,请求服务器(构建请求报文,并且将请求报文发送 ...
- ASP.NET MVC源码分析
MVC4 源码分析(Visual studio 2012/2013) HttpModule中重要的UrlRoutingModule 9:this.OnApplicationPostResolveReq ...
- asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证
原文:asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证 在前面的文章中我们曾经涉及到ControllerActionInvoker类GetPara ...
- asp.net mvc源码分析-ModelValidatorProviders 客户端的验证
几年写过asp.net mvc源码分析-ModelValidatorProviders 当时主要是考虑mvc的流程对,客户端的验证也只是简单的提及了一下,现在我们来仔细看一下客户端的验证. 如图所示, ...
- ASP.NET MVC 源码分析(一)
ASP.NET MVC 源码分析(一) 直接上图: 我们先来看Core的设计: 从项目结构来看,asp.net.mvc.core有以下目录: ActionConstraints:action限制相关 ...
- 精尽Spring MVC源码分析 - 寻找遗失的 web.xml
该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...
- 精尽Spring MVC源码分析 - 调式环境搭建
该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...
- 精尽Spring MVC源码分析 - 文章导读
该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...
- 精尽Spring MVC源码分析 - WebApplicationContext 容器的初始化
该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...
随机推荐
- C#多线程实现方法——Task/Task.Factary
原文:C#多线程实现方法--Task/Task.Factary Task 使用 Task以及Task.Factory都是在.Net 4引用的.Task跟Thread很类似,通过下面例子可以看到. st ...
- 使用Elasticsearch、Logstash、Kibana与Redis(作为缓冲区)对Nginx日志进行收集(转)
摘要 使用Elasticsearch.Logstash.Kibana与Redis(作为缓冲区)对Nginx日志进行收集 版本 elasticsearch版本: elasticsearch-2.2.0 ...
- Git 使用规范流程(转)
团队开发中,遵循一个合理.清晰的Git使用流程,是非常重要的. 否则,每个人都提交一堆杂乱无章的commit,项目很快就会变得难以协调和维护. 下面是ThoughtBot 的Git使用规范流程.我从中 ...
- 14.2.5.5 Change Buffer
14.2.5.5 Change Buffer change buffer是一个指定的数据结构 用于caches 数据到secondary index pages 当影响的pages 不是在buffer ...
- 使用CUNIT测试
使用CUNIT测试 一:概述 CUnit是一个c语言的单元测试框架,它是以静态链接库的形式,连接到用户代码中的,主要的功能就是提供了语义丰富的断言和多种测试结果输出接口,可以方便地生成测试报告. 但是 ...
- web.xml在<init-param>一个错误
Description ResourcePathLocationType cvc-complex-type.2.4.a: Invalid content was found starting with ...
- 呜呼!Node.js是什么?
近期看到非常多站点都使用node.js.開始感到非常好奇.就開始推測这是个什么东西,大概就是个js文件吧,所以開始根本 没有在意,可是越感觉就认为越不正确劲,为什么大家都在用它呢?所以我决定搞个明确. ...
- [C++]引用浅析
Date:2013-12-22 Summary: 引用数据类型的一些概念记录(沟通中提到引用必须结合语境才能知道说的是引用变量还是“引用”这一行为,再次提到引用指的一般是引用变量) Contents: ...
- 新出台的治理iMessage垃圾短信的规则
工信部拟制定<通信短信息服务管理规定>,为治理垃圾短信提供执法根据.当中,对于苹果iMessage垃圾信息泛滥现象,工信部也将跟踪研究技术监測和防范手段.这意味着长期以来处于监管" ...
- 7.MongoDB java CRUD
注意:要增加mongodb对应的jar包 package cn.toto.mongodb; import java.net.UnknownHostException; import org.bson. ...