在服务端判断客户端传过来的文件的类型,如果是静态文件,直接返回,在页面输出显示。如果是动态文件,通过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. commons-lang使用

    跟java.lang这个包的作用类似,Commons Lang这一组API也是提供一些基础的.通用的操作和处理,如自动生成toString()的结果.自动实现hashCode()和equals()方法 ...

  2. IOS 通过button获取cell

    在使用tableview时,有时我们需要在cell中添加button和label,以便添加某项功能,而且往往点这个button的方法中需要知道button所在cell中label内存放的值. 一般而言 ...

  3. LeetCode_Combination Sum

    Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C wher ...

  4. Linux watch 命令

    man watch: WATCH(1) Linux User's Manual WATCH(1) NAME watch - execute a program periodically, showin ...

  5. cv:显示Linux命令运行进度

    cv: 显示 cp.mv 等命令的进度 2014-07-14 By toy Posted in Apps Edit on GitHub 在 Linux 系统中 , 大多数命令从来都是信奉 “ 沉默是金 ...

  6. sicily 1007 To and Fro

    题意:字符串的操作处理 // Problem#: 8768 // Submission#: 2606406 // The source code is licensed under Creative ...

  7. AngularJs学习笔记2——四大特性之MVC

    angularJs的四大特性 ①.采用MVC的设计模式 ②.双向数据绑定 ③.依赖注入 ④.模块化设计 现在细说一下MVC的设计模式: MVC: Model(模型)--项目中的数据 View(视图)- ...

  8. 如何在android上去控制开发进度

    这次android的壁纸软件1.0版本终于可以上线了,软件的功能基本上实现了,但是用户体验不太好.在整个开发阶段和测试阶段,出现了很多预料之外的事情,比如size是1M多的json文件解析.高清图片导 ...

  9. (LeetCode)两个队列来实现一个栈

    原题例如以下: Implement the following operations of a stack using queues. push(x) -- Push element x onto s ...

  10. Window7下vagrant的部署

    1. 下载并安装VirtualBox     下载地址:https://www.virtualbox.org/wiki/Downloads,下载最新的安装包,接下来的安装步骤就是下一步下一步了,你懂的 ...