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属于全局性 ...
随机推荐
- 安装JDK+Tomcat,进行环境变量设置,和运行JSP
系统:windows 7 64-bit 安装前需要用到的软件 JDK7u21 Tomcat 8.0 下载64-bit Windows zip就好 安装JDK7u21 和平常安装软件一样,路径也不要动, ...
- 利用GPS获取行车速度和距离
这几天项目中需要GPS计算汽车的速度和行驶距离,这里简单记录一下使用过程 1 和平常使用地图一样,在Info.plist中添加位置请求 2 在viewdidLoad中初始化locationManage ...
- 手绘经典QQ头像 请让我一个人呆一会
- 从点击Button到弹出一个MessageBox, 背后发生了什么(每个UI线程都有一个ThreadInfo结构, 里面包含4个队列和一些标志位)
思考一个最简单的程序行为:我们的Dialog上有一个Button, 当用户用鼠标点击这个Button时, 我们弹出一个MessageBox. 这个看似简单的行为, 谁能说清楚它是如何运行起来的,背 ...
- 转:使用linq to sql 随机取一行数据的方法
原文地址:http://outofmemory.cn/code-snippet/1760/usage-linq-to-sql-suiji-take-yixing-data-method 虽然这看来已经 ...
- NOI2015
D1T1 并查集. #include<cstdio> #include<cstdlib> #include<iostream> #include<fstrea ...
- struct2(二) struct2的hello world 程序
在struct2 的web应用程序中,当你点击一个超链接或者提交一个HTML页面的时候,并不是直接的转向一个另一个的页面,而是转到你提供的一个Java 类.这个过程被称为一个action,一个acti ...
- poj3237--Tree 树链剖分
题意:三种操作 ①修改第i条边的权值为val,②把u到v路径上的所有边的权值 去相反数③求u 到v路径上最大的边权 线段树的区间更新还是不熟练,,一直搞不对调试了好久还是没对,最后还是看的kuangb ...
- JAVA中运用数组的四种排序方法
JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法.冒泡法.选择排序法.插入排序法. 快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现. 冒泡法是运用遍历数组进 ...
- Log4j使用说明
Log4J实例应用开发 在实际编程时,要使Log4j真正在系统中运行事先还要对配置文件进行定义.定义步骤就是对Logger.Appender及Layout的分别使用.Log4j支持两种配置文件格式,一 ...