前言: 今天继续吧这个系列补齐,这几天公司的项目比较忙,回到家已经很是的累了,因此也没顾得上每天来这里分享一些东西和你们一块儿探讨,可是今天晚上我仍是坚持打开电脑,分享一些asp。net生命周期的知识,一是能够巩固本身所掌握的知识,而且在分享的期间也能发现一些问题和你们一块儿探讨,同时也但愿让一些“小白”们尽量的了解asp内部的运行原理,不要天天只知道把控件拖来拖去,或者是只是知道这么写代码,而不知道为何这么写代码。html
首先呢,让咱们在复习一下上一节的内容:web
1)浏览器输入请求网址的域名,浏览器按照HTTP协议封装成请求报文,而后经过DNS解析域名获得IP地址,接着经过socket插座将请求报文传到服务器.windows
2)IIS接受到请求后,解析要求请的是一个什么类型的文件,若是请求的是静态文件,那么IIS会直接处理,在本地找到请求的静态文件,而后发送给浏览器。api
3)若是是动态文件,如aspx或者ashx等动态文件,IIS会发现本身处理不了这样的文件,那么,IIS就会去他的映射表里面去找,实现它接口的那个扩展程序能够处理这样的动态文件,而后IIS发现有个叫作aspnet_isapi的这样一个扩展程序能够处理处理像.aspx和.ashx这样后缀名的文件,那么IIS则把请求交给这个aspnet_isapi来处理。浏览器
4)aspnet_isapi将启动CLR(公共语言运行时),负责启动asp.net框架的域,而后将请求交给asp.net框架来处理,框架里面有个一HttpRuntime类的对象,那倒请求后,它负责将请求封装成HttpContext对象,常见Application对象,调用application对象的ProcessRequest方法(HttpContext对象做为参数)处理请求(具体的实现咱们将在后面讲解到),最后处理完成后,返回给IIS,IIS在返回给浏览器。缓存
这是上一结咱们所讲的内容,那这一节咱们主要讲的是:安全
1--请求报文是怎么到iis的,iis又是怎么处理的服务器
2--请求报文时怎么传递给CRL的app
3--CRL拿到请求以后具体是解析处理请求,而后呈现出咱们想要的页面。这里咱们重点研究两个东西:框架
1)---Application对象的建立以及 HttpModule 注册管道的事件 golable注册管道事件
2)---页面的生命周期
这一节的内容比较多,并且有些小伙伴认为这里面有些东西是在开发过程中用不到这知识,可是笔者认为从基础和原理去了解才能让咱们正确的掌握asp。net开发而且开发出高质量的应用程序。
在阅读本节内容时,你们先了解一下如下几个概念
内核模式:就是操做系统模式,其中的程序代码能直接访问全部内存(包括全部的用户模式进程和应用程序的地址空间)和硬件,也称为“管理员模式”、“保护模式”或“Ring 0”。
用户模式:跑在操做系统之上,好比说qq,百度影音这些应用程序。都是跑在用户模式之上的。
在windows xp之前(包括xp),基于http协议的的程序都是在用户模式下运行的,并且必须本身处理例如软件中断、context swith、线程调度等问题,而且没法直接接触系统资源,过去,HTTP服务器,如IIS, Apache等都是利用Winsock API来建立一个User mode下的network listener,这个network listener每每独自占用一个ip端口,也就是说,同一个端口在同一时间只能有一个应用程序监听,这在有些时候是一个不太使人舒服的限制。
在windows 2003之后,
进了新的HTTP API和kernel mode driver(内核模式驱动) Http.sys,目的是使基于Http服务的程序更有效率。这个改变的直接收益者就是IIS6.0和ASP.NET。
那么如今是有http.sys来监听求情端口。http.sys得好处:
一、能够缓存,静态内容能够缓存到内核模式下,是服务器相应更加快速
二、安全可靠,应为全部的请求都会在http.sys里面暂存在列队中,而不是由服务程序自己来处理,这样一来,就是服务程序崩溃重启,请求也不会丢失。
三、IP端口重用 - 如今,只要是经过Http.sys管理的端口(基本包括了那些著名的端口,好比80),均可以同时容许多个程序同时监听了。
四、带宽控制(额。。其实我也不知道他这个是咋控制的,反正就是能控制)
好了,了解了这些以后,让咱们进入今天的正题。
首先我仍是上一个图吧。你们看着图,而后我在下面解释,我以为这样会解释的更清楚一些。
1--首先,浏览器发送一条请求到服务器,服务器端,内核模式下的http.sys这个内核驱动,拿到了http请求,拿到请求后,他要去找,哪一个应用程序能够处理这个求情(或者说去找谁在我这注册过,说它吖的能够处理http请求),去哪找呢,是去注册表里面找。而后他发现,有个叫iis的小子在我这注册过,说它能够处理,那么http.sys就把这个请求交给iis去处理。
2--这时,iis拿到了请求。 其实iis能够分为两块,一块就是iis的核心进程:inetinfo.exe(这里面放着iis的全部的配置信息和网站信息),另外一块就是w3svc服务(寄生在svchost进程上),这个服就是管着将请求分发的。分发给什么呢?就是在上一节中咱们说到的像aspnet_isapi.dll这样的扩展程序。这个服务先去核心进程里面的配置信息里面去寻找,注册的哪一个扩展程序能够处理请求的页面,好比请求的是aspx页面,他发现aspnet_isapi.dll这个扩这注册了说它能够处理,那么w3svc服务将请求分发给aspnet_isapi.dll来处理。
3--这时,aspnet_isapi.dll 拿到了请求信息,这时,aspnet_isapi.dll负责启动CLR(公共语言运行时,里面跑的是托管代码),这里你能够把aspnet_isapi.dll当作是一个桥梁,一个非托管和托管之间的一个桥梁 。
CLR被启动好了以后,调用托管代码中ISAPIRuntime得ProcessRequest(之后我会简称其为PR方法),ISAPIRuntime类就是system。web。hosting命名空间下的一个类,也是CLR处理http请求的一个入口类,若是你想看CRL是怎么处理http请求,你就能够从这个类开始。
在上图中咱们能够看出调用了ISAPIRuntime类的PR方法,将http请求信息(ecb)做为参数传进去。
---ecb:包含了底层的全部请求信息,包括服务器信息,一个来组织标量的输入流还有一个写回数据给浏览器的输出流,,它包含了ISAPI求其的全部功能。
如上图在ISAPIRuntime的PR方法中,先建立了一个HttpWorkerRequest对象,而后又调用了HTTPRuntime的PR方法进一步处理请求。
如上图,在HttpRuntime的PR方法里面,主要三个事就是:
1--建立上下文对象HttpContext(将请求信息封装成上下文对象)
2--建立Application对象:这里用到了应用程序池技术,由于建立一个Application对象很消耗资源。这个Application对象很重要,在下一节咱们重点讨论他,同时在下一节还讨论时如何建立页面控件树的。
3--调用Application对象的PR方法,将上下文对象做为参数穿进去。此时,http请求(这时候已经被封装成HttpContext)就由application交给了HttpHandler来处理,而后调用HttpHandler的PR方法,继续处理请求(这里开始走页面的生命周期,也就是那十个事件)
在HttpApplication的PR方法里,开始走HttpApplication负责的求情处理管道,就是咱们常常说的19个事件,23个步骤。
在这个请求处理管道里面具体的内容,我贴上两个图,相信你们就看的差很少明白了,若是不明白也不要紧,在下一节我会详细介绍请求管道干的事情和咱们在开发过程当中若是应用这个管道写出高质量的web应用程序。
好啦,今天就介绍到这吧,各位,晚安。