在服务端判断客户端传过来的文件的类型,如果是静态文件,直接返回,在页面输出显示。如果是动态文件,通过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请求过程 简单分析(一)的更多相关文章

  1. struts2请求过程源代码分析

    struts2请求过程源代码分析 Struts2是Struts社区和WebWork社区的共同成果.我们甚至能够说,Struts2是WebWork的升级版.他採用的正是WebWork的核心,所以.Str ...

  2. mvc请求过程总结

    前言 最近在思考一个问题,我的学习方法一般主要是看博客来学习新东西,但是光看,基本也没总结过,所以经常会出现这样的问题,某个知识点我知道,但是就是不能很好的表达出来,很简单的东西往往都不知道如何简短精 ...

  3. spring mvc请求过程

    spring mvc处理请求过程 1.    首先客户端发送一个HTTP请求,Web服务器接收这个请求,如果匹配DispatcherServlet的请求映射路径,web容器将请求转交给Dispatch ...

  4. mini-uboot 启动过程简单分析

    单片机有最小系统,所谓最小系统,就是单片机能正常工作所需要的最少外设.对于Uboot来说,同样有个最小系统,因为Uboot最主要的功能就是引导内核.下面我们通过一个简单的Mini-Uboot来分析Ub ...

  5. 用户HTTP请求过程简单剖析

    用户终端(如电脑浏览器)发起某个url请求,如http://www.baidu.com/1.jpg. 1.电脑首先会对www.baidu.com进行解析请求,获得域名对应的服务器IP. 2.电脑对服务 ...

  6. Asp.net Mvc 请求是如何到达 MvcHandler的——UrlRoutingModule、MvcRouteHandler分析,并造个轮子

    这个是转载自:http://www.cnblogs.com/keyindex/archive/2012/08/11/2634005.html(那个比较容易忘记,希望博主不要生气的) 前言 本文假定读者 ...

  7. spring MVC处理请求过程及配置详解

    本文主要梳理下Spring MVC处理http请求的过程,以及配置servlet及业务application需要的常用标签,及其包含的意义. spring MVC处理请求过程 首先看一个整体图 简单说 ...

  8. spring MVC处理请求过程

    spring MVC处理请求过程 首先看一个整体图 简单说下各步骤: handlerMapping handlerMapping将请求映射到处理器,即图中的HandlerExecutionChain. ...

  9. Asp.Net MVC 请求原理分析

    分析Asp.Net MVC的请求过程,我们从以下几方面看: 配置:IIS网站的配置可以分为两个块:全局 Web.Config 和本站 Web.Config . Asp.Net Routing属于全局性 ...

随机推荐

  1. (摘)DataGuard物理standby管理 - 主备切换

    DataGuard物理standby管理 - 主备切换 Dataguard的切换分为两种,switchover和failover. switchover一般用于数据库或硬件升级,这时只需要较短时间中断 ...

  2. PYTHON线程知识再研习C---线程互斥锁

    结合例子,就很好理解了. 就是不要让共享变量被各个线程无序执行,导致结果不可预期 threading模块中定义了Lock类,可以方便的处理锁定: #创建锁mutex = threading.Lock( ...

  3. [LeetCode 121] - 买入与卖出股票的最佳时机(Best Time to Buy and Sell Stock)

    问题 假设你有一个数组,其中的第i个元素表示一只股票在第i天的价格. 如果只允许你完成一次交易(即买入并卖出股票一次),设计一个找出最大利润的算法. 初始思路 和122一样,基于买入与卖出股票的最佳时 ...

  4. LeetCode_Climbing Stairs

    ou are climbing a stair case. It takes n steps to reach to the top. or steps. In how many distinct w ...

  5. 图论:2-SAT模板

    #include<cstdio> #include<vector> #include<cstring> using namespace std; const int ...

  6. 理解Spring MVC Model Attribute和Session Attribute

    作为一名 Java Web 应用开发者,你已经快速学习了 request(HttpServletRequest)和 session(HttpSession)作用域.在设计和构建 Java Web 应用 ...

  7. hsql使用架构包启动数据库

    一.通常我们平时启动就是直接通过hsql.jar来进行启动 java -cp hsqldb.jar org.hsqldb.util.DatabaseManagerSwing java -cp hsql ...

  8. css中的边框样式

    在盒子模型中,盒子的边框是其重要的样式,通过边框我们可以很方便地看出盒子的长宽以及大小.边框的特性可以通过边框线,边框的宽度及颜色来呈现. 1,边框线 边框线指的是边框线条的样式,包括实线,虚线,点划 ...

  9. (转)Iphone数组一些基础操作 NSArray/NSMutableArray

    /******************************************************************************************* NSArray ...

  10. CSS3 div水平、垂直居中,IE9以上、Firefox、Chrome均正常

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...