日期:2014-05-16  浏览次数:20958 次

ASP.NET之旅--浅谈Asp.net运行机制(一)

       上篇博客基础(ASP.NET之旅--深入浅出解读IIS架构)

       很多Asp.net开发人员都有过Asp的背景,以至于我们开发程序的时候总是停留在“页面”层次思考,也就是说我们常常会只考虑我们现在所做的系统是要完成什么功能,是要做问卷调查网站还是个人网站,而很少在“请求级”思考,思考能不能通过编码的方式来操作一个Http请求。在跨入Asp.net后Asp有了质的飞跃,很多底层的Http请求都得到了良好的应用,这时候Asp.net不仅仅是一门开发语言,而是一个开发平台。想要能在“请求级”来实现编码,我们就不得不来说说Asp.net的内部运行机制。

 

一、Asp.net顶层运行机制

       当客户端的Http请求到达服务器后,IIS会为Http请求分配应用程序池,在应用程序池中创建请求需要的管道,请求管道将Http请求的各步骤进行了分配。  

       当第一次请求页面时,在请求管道中经过了身份验证等模块的一系列操作后,他会被映射处理程序处理,发现要请求的是.aspx页面,这时请求将转交给Asp.net执行也就是我们上图的步骤2。Asp.net页面分为前台.aspx文件和后台.cs文件,Asp.net引擎会将前台文件和后台文件合并生成一个页面(Page)类,然后再由编译器将该页面类编译成为程序集,再由程序集生成静态HTML页面,然后将HTML文件返回给映射处理程序,并将静态HTML页面返回给客户端浏览器解释运行。

//Page 类与扩展名为 .aspx 的文件相关联。
//表示从 ASP.NET Web 应用程序的宿主服务器请求的 .aspx 文件。 这些文件在运行时被编译为 Page 对象,并被缓存在服务器内存中。
//Page类的属性中包含有Asp的所有对象,如:Application、Request、Response等对象
//开发人员在页面编程中使用的对象也都是使用该类的属性,对于这些对象的产生将会在下面章节中讲到
//Asp.net程序中创建的语法如下:
public class Page : TemplateControl, IHttpHandler

 

      Note:生成的程序集一般会被放在服务器的C:/windows/Microsoft .NET/Framework/V4.0 303 19/Temporary ASP.NET Files目录下。


       当用户第二次请求该页面时,直接调用编译好的程序集即可,从而大大提高打开页面的速度。正因为如此,我们才会发现当用户第一次打开该页面时速度会很慢,但是以后再打开该页面速度会很快的原因。

       这里我们站在一个比较高层次上看Asp.net的运行机制,我们一步步的将HTTP请求转变成了我们通常可见的HTML页,但却忽略了很多细节。首先请求在进入管道后,HTTP请求是如何一步步转交给.aspx文件的,其次在页面编程时会用到很多Asp对象这些对象是如何创建的。不着急,我们将问题上抛,进入我们的第二节。

 

二、IIS集成模块处理机制


       上节站在较高层次上解读了Asp.net的运行机制,请求过程很简单,核心的东西是Asp.net引擎,在第一次请求时它将请求的页面编译成为程序集,在以后的请求中只调用请求的程序集即可,大大提高了执行效率。在这里还要清楚一点,上图中的从步骤2往后的请求是在模块中实现的。那么何为请求模块呢,我们继续往下看。


 1、理解HttpModule模块


       在以前我们说过IIS7.0以后的版本中管道模式升级为了集成模式,在请求管道中我们可以任意指定请求的模块来实现我们的请求,同时为了实现某个功能开发人员也可以自己编写模块来把它集成到IIS中。这种模块其实封装了一个个的处理单元,当HTTP请求进入模块后,处理单元会根据请求信息来实现各自模块的功能,在处理完成后会把HTTP请求的信息返回到HttpHandler中。
       IIS中也自带了很多处理模块,如:下图中的身份验证的Anon模块、Static File模块、Default Document模块等。


       上图是HTTP请求进入W3WP.exe进程后的工作流程。