当前位置: 代码迷 >> ASP >> ASP.NET之旅-浅谈Asp.net运行机制(1)
  详细解决方案

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

热度:232   发布时间:2013-10-08 16:38:32.0
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进程后的工作流程。


       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
呵呵,常来啊……