图解DotNet框架之八:ASP.NET
当服务器(ASP.NET)接收到一个 Http请求的时候,他会如何工作呢?
还是老思路,我们先来看图:
这个图和上一篇中的图,基本上是一样的(为了便于学习和记忆,我将一些不太重要的东西去掉了).
那么我们现在来分析一下ASP.NET的运行过程吧。
首先从第一个方块说起:启动IIS进程,对于IIS来说,它依赖一个叫做 HTTP.SYS 的内置驱动程序来监听来自外部的 HTTP请求。在操作系统启动的时候,IIS首先在HTTP.SYS中注册自己的虚拟路径。实际上相当于告诉HTTP.SYS哪些URL是可以访问的,哪 些是不可以访问的。
第二个方块:在CLR挑选好了要加载Mscorewk.dll还是Mscorsvr.dll以后,就要加载MScorlib.dll和对应的工作者 进程(如果请求的是一个可访问的URL),HTTP.SYS会将这个请求交给 IIS 工作者进程。IIS6.0是w3wq.exe,IIS5.0是aspnet_wp.exe,每个工作者进程都有一个身份标识.
第三个方块:编译好机器码以后,就可以执行指令了,这里会创建Systemdomain,它包含了SharedDomain和默认的应用程序域,也 就是当前应用程序自己的域,前面我们说过一个.net进程中可以包含多个默认的应用程序域,而这些应用程序域都会用到mscorlib.dll,如果每个 默认的应用程序域中都去加载它,那么无疑会造成内存的浪费,所以就有了SharedDomain,它是用来放所有Domain都要用到的Dll,这样就避 免了浪费内存.也优化了加载的速度.
第四个方块:这时候默认的应用程序域,就会去找到Aspnet_wp.exe中的Main方法.
OK明白了ASP.NET的启动过程,我们来看看AppDomain都做了什么,还是来看图:
1. HttpRuntime将Http请求转交给 HttpApplicationFactory,由他将Global.asax与编译好的Webapplication.dll中的 Global.aszx.cs编译生成HttpApplication,HttpApplication代表着我们创建的Web应用程序。 HttpApplication创建针对此Http请求的 HttpContext对象,这个对象包含了关于此请求的诸多其他对象,主要是HttpRequest、HttpResponse、 HttpSessionState等。这些对象在程序中可以通过Page类或者Context类进行访问。
2. HttpApplication根据Web.config加载一系列Module,如sessionstate Module 就可以拦截Application_BeginRequest来处理Session.并且HttpApplication会获得Httphandler, 并且编译请求的aspx页面.
3. Http请求经过所有的Module之后,它会被HttpHandler处理。,通常也就是.aspx.cs文件所完成的逻辑。我们知道.aspx 页面继承自Page类,Page类实现了IHttpHandler接口,HttpHandler也是Http请求处理的最底层。
4.HttpHandler处理完以后,Http请求再一次回到Module,此时Module可以做一些某个工作已经完成了之后的事情。Asp.Net 中有众多的 XXing 、XXed 之类成对的事件,这里就是为什么Asp.Net可以将一个XX操作分成前后两部分,然后再分别进行事件拦截的幕后原理。
下面我们来看看构建一个ASP.NET应用程序最常用的类的层次结构.
我们所用到的大部分<asp:XXX>的控件,全部继承自WebControl,而最基本HTML元素则继承自HtmlControl.而.aspx 页面继承自Page类.
MS在ASP.NET的页面采用的方式和Winform差不多,也是Composite的方式,具体的参见 图解DotNet框架之七:Winform ,这里不再赘述.