上篇博客基础(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进程后的工作流程。
Note:W3WP.exe它是一个工作进程,该进程实现了IIS和应用程序池的联接工作。如果有多个应用程序池在运行就会对应有多个W3WP.exe的进程实例运行。另外Managed
Engines模块是.NET的驱动程序,它将HTTP请求从IIS的集成模式中连接到.NET Runtime。
这张图上的请求可以看出Http请求在发送到IIS管道后,首先是由HttpModule的Authentication处理,处理完成后为请求授予权限,请求的信息有多种形式,至于几种特殊的请求方式我们将会在系列博文中讲到。HttpHandler来处理,HttpModule负责请求的身份验证及授权操作。
Note:加载哪些 ASP.NET 模块(如 SessionStateModule)取决于应用程序从父应用程序继承的托管代码模块。 这还取决于在应用程序的 Web.config 文件的配置节中配置了哪些模块。(想要了解更多有关IIS集成模式下模块的工作,请查看官网http://www.iis.net/learn/get-started/introduction-to-iis/introduction-to-iis-architecture。)
本节我们主要介绍了HTTP请求在进入IIS后进行的一系列模块请求,究竟由哪些模块来处理请求是由应用程序的父应用程序和Web.config配置决定。在HTTP请求进入Web Server Core后会触发一系列的管道事件,这些管道事件驱动了HTTP请求的正常运行。对于这些管道事件及IIS和.NET底层代码的运行机制,将会在下节中讲到。
下接博客:ASP.NET之旅--浅谈Asp.net的运行机制(二)
- 2楼lfmilaoshi前天 10:24
- 一看就是个高手,写系列了呢,将来我给你出书。
- Re: zhang_xinxiu前天 10:25
- 嗯,正向您说的方向努力哪……
- 1楼jishuilongan3天前 16:24
- 写的真好,学习了……
- Re: zhang_xinxiu前天 22:20
- 呵呵,常来啊……