MVC请求过程 简单分析(一)
在服务端判断客户端传过来的文件的类型,如果是静态文件,直接返回,在页面输出显示。如果是动态文件,通过aspnet_isapi.dll转交过.NetFrameWork框架执行。
创建ISAPIruntime对象,执行ISAPIruntime对象中的ProcessRequest()方法
ProcessRequest()方法可以看做是进入Asp.Net的入口点。
ProcessRequest()方法:
根据传进来的句柄(请求报文的编号)寻找资源,创建ISAPIWorkerRequest对象wr,将请求报文的内容封装到wr中,在将wr传到HttpRuntime中。
ProcessRequestNoDemand()方法:
ProcessRequestNow()方法:
ProcessRequestInternal()方法:
创建HttpContext对象,然后将请求报文wr都封装到context中。
创建HttpApplication对象,通过HttpApplicationFactory()这个工厂类的GetApplicationInstance方法来创建,在HttpApplication池中创建,也就是在栈中操作,池的寿命与应用程序的寿命相同。
GetApplicationInstance():
这个是创建HttpApplication对象的工厂类GetApplicationInstance()中的方法。
创建HttpApplication对象中有三个关键的方法。
第一个方法:EnsureInited():
双重锁定这个工厂类,检查HttpApplicationFactory有没有被初始化,这个this代表的是HttpApplicationFactory这个工厂类。如果没有,通过this.Init()方法进行初始化。首先用this.GetApplicationFile()方法寻找global.asax文件地址,拿到global.asax文件。然后调用this.CompileApplication()方法对global.asax文件进行编译,得到theApplicationType这个类型。
第二个方法:EnsureAppStartCalled(context):
拿到global.asax文件,调用并且确保在程序启动的时候只调用一次global文件中Application_Start()方法。获取所有的路由信息。
第三个方法:GetNormalApplicationInstance(context):
创建HttpApplication对象,创建成功后并调用InitInternal()方法进行初始化。读取配置文件中的所有的对于module的配置内容。拿到系统定义的module和程序员自己定义的module,保存到HttpModuleCollection集合中,然后遍历读取HttpModuleCollection集合.
创建HttpApplication之后进入请求管道。
在初始化HttpApplication时候,可以拿到系统定义和程序员定义的module。
查看系统定义的module:UrlRoutingModule
找到Init()初始化module的方法
UrlRoutingModule.Init()方法:
初始化模块,将OnApplicationPostResolveRequestCache这个事件注册到管道的第七个事件中,等走到请求管道中的第七个事件中的时候执行这个方法。
OnApplicationPostResolveRequestCache()方法:
HttpApplication对象触发的这个事件,sender代表触发这个事件的源。所有可以将sender转成HttpApplication。
HttpContextBase类为抽象类,该类包含的成员与 HttpContext 类相同。使用 HttpContextBase类可以创建一些派生类,这些派生类与 HttpContext 类相似,但是可以进行自定义并在 ASP.NET 管道外部使用。
用HttpContextBase创建上下文对象context。
将请求内容进一步封装到context对象中。
执行PostResolveRequestCache(context)方法。
PostResolveRequestCache()方法:
匹配路由的 HTTP 请求,检索该路由的处理程序,并将该处理程序设置为当前请求的 HTTP 处理程序。
将获得到的路由规则和封装之后的context里的请求报文进行匹配,返回路由数据。
获取路由请求的对象 ,报文中的一些方法之类的东西,判断是否为空
如果路由数据为不为空说明是匹配成功,拿到路由数据的属性。
对请求报文进一次处理封装,返回一个实例,用IHttpHandler对象httpHandler接收。
这里的httpHandler就是MVCHandler,MVC源码中MVCHandler这个类继承IHttpAsyncHandler, IHttpHandler, IRequiresSessionState
最后将当前请求映射到HttpHandler上。
MVC请求过程 简单分析(一)的更多相关文章
- struts2请求过程源代码分析
struts2请求过程源代码分析 Struts2是Struts社区和WebWork社区的共同成果.我们甚至能够说,Struts2是WebWork的升级版.他採用的正是WebWork的核心,所以.Str ...
- mvc请求过程总结
前言 最近在思考一个问题,我的学习方法一般主要是看博客来学习新东西,但是光看,基本也没总结过,所以经常会出现这样的问题,某个知识点我知道,但是就是不能很好的表达出来,很简单的东西往往都不知道如何简短精 ...
- spring mvc请求过程
spring mvc处理请求过程 1. 首先客户端发送一个HTTP请求,Web服务器接收这个请求,如果匹配DispatcherServlet的请求映射路径,web容器将请求转交给Dispatch ...
- mini-uboot 启动过程简单分析
单片机有最小系统,所谓最小系统,就是单片机能正常工作所需要的最少外设.对于Uboot来说,同样有个最小系统,因为Uboot最主要的功能就是引导内核.下面我们通过一个简单的Mini-Uboot来分析Ub ...
- 用户HTTP请求过程简单剖析
用户终端(如电脑浏览器)发起某个url请求,如http://www.baidu.com/1.jpg. 1.电脑首先会对www.baidu.com进行解析请求,获得域名对应的服务器IP. 2.电脑对服务 ...
- Asp.net Mvc 请求是如何到达 MvcHandler的——UrlRoutingModule、MvcRouteHandler分析,并造个轮子
这个是转载自:http://www.cnblogs.com/keyindex/archive/2012/08/11/2634005.html(那个比较容易忘记,希望博主不要生气的) 前言 本文假定读者 ...
- spring MVC处理请求过程及配置详解
本文主要梳理下Spring MVC处理http请求的过程,以及配置servlet及业务application需要的常用标签,及其包含的意义. spring MVC处理请求过程 首先看一个整体图 简单说 ...
- spring MVC处理请求过程
spring MVC处理请求过程 首先看一个整体图 简单说下各步骤: handlerMapping handlerMapping将请求映射到处理器,即图中的HandlerExecutionChain. ...
- Asp.Net MVC 请求原理分析
分析Asp.Net MVC的请求过程,我们从以下几方面看: 配置:IIS网站的配置可以分为两个块:全局 Web.Config 和本站 Web.Config . Asp.Net Routing属于全局性 ...
随机推荐
- android 巧用finish方法
在android应用开发中,我们从一个activity跳到另一个activity时,我么要用到Intent: eg:Intent intent = new Intent(A.this,B.class) ...
- VMware vSphere 6 Enterprise Plus License
Product: VMware vSphere 6 Enterprise Plus Licensed for 2 physical CPUs (unlimited cores per CPU) Lic ...
- XJOI网上同步训练DAY5 T3
就是对于一个数,我们去考虑把t*****减到(t-1)9999*的代价. #include<cstdio> #include<cmath> #include<algori ...
- 单元测试之C/C++
如今TDD很火,我公司小,一般写代码不写测试用例的,一般就是随便测试下函数的输入输出,没用工具或框架来测试,非常简单,一点也不正规化. 在一种传统的结构化编程语言中,比如C,要进行测试的单元一般是函数 ...
- Could not open ServletContext resource [/WEB-INF/applicationContext.xml]解决方法
抛错: org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document ...
- lucene 使用教程
原文转自:http://cloudera.iteye.com/blog/656459 1 lucene简介 1.1 什么是lucene Lucene是一个全文搜索框架,而不是应用产品.因此它并不像 ...
- HBase面试问题
一.HBase的特点是什么 1.HBase一个分布式的基于列式存储的数据库,基于hadoop的hdfs存储,zookeeper进行管理. 2.HBase适合存储半结构化或非结构化数据,对于数据结构字段 ...
- POJ 1322 Chocolate
Chocolate Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8245 Accepted: 2186 Speci ...
- FragmentPagerAdapter与FragmentStatePagerAdapter差异
平常使用的FragmentPagerAdapter和FragmentStatePagerAdapter来自android.support.v4.app包用来构建ViewPager. FragmentP ...
- IT痴汉的工作现状25-技术之养成
要想成为技术大牛,除了天赋以外,更与后天的刻苦努力分不开.伟仔我天生愚顿.工作多年后仍与大牛相差甚远,更加觉得技术的养成是一个异常困难的过程. 是我不用功吗?我不这样觉得.伟仔尽管是个懒人,但对于技术 ...