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

作者(passion) 阅读(951次) 评论(0) 分类( 软件)

很多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页面返回给客户端浏览器解释运行。

  1. //Page 类与扩展名为 .aspx 的文件相关联。  

  2. //表示从 ASP.NET Web 应用程序的宿主服务器请求的 .aspx 文件。 这些文件在运行时被编译为 Page 对象,并被缓存在服务器内存中。  

  3. //Page类的属性中包含有Asp的所有对象,如:Application、Request、Response等对象  

  4. //开发人员在页面编程中使用的对象也都是使用该类的属性,对于这些对象的产生将会在下面章节中讲到  

  5. //Asp.net程序中创建的语法如下:  

  6. 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底层代码的运行机制,将会在下节中讲到。


« 上一篇:wifi共享上网(至尊版wifi)
« 下一篇:ASP.NET附加数据库文件的方式,如何发布到IIS7而不导致SQLServer出错
在这里写下您精彩的评论
  • 微信

  • QQ

  • 支付宝

返回首页
返回首页 img
返回顶部~
返回顶部 img