|
这几天认真地看了黄忠成先生的<<Asp.Net组件设计>>中的第三章中的第一节,标题:由IIS到Page对象,在博客园大家对这章内容也比较了解,虽然这章内容晦涩难懂,但的确是精华所在,所以我也是连读了好几遍,再加上在网上也找了一些相关资料学习了一下,觉得理解比先前透彻了一些,所以想把自己的心得贴出来,给大家指正一下,共同学习.
首先当访问者在浏览器中输入网址,这个请求被传至IIS服务器,我们假设这个请求是一个*.aspx文件,这个请求将会被inetinfo.exe进程所截获,所有的请求都要经过inetinfo.exe,由它来判断请求文件的扩展名,当它得知是.aspx时,会将请求转交给aspnet_isapi.dll文件(大家可通过IIS中关于请求文件扩展名映射表来获得更多的信息),aspnet_isapi.dll在此处扮演的也是一个入口的角色,它获得这个请求后,将通过NamePipe管道,将请求转送给aspnet_wp.exe进程,aspnet_wp.exe会根据请求来解出其中的信息也就是虚拟目录信息来创建一个新的AppDomain.在创建AppDomain时aspnet_wp.exe会判断虚拟目录所对应的AppDomain是否存在,如果存在就不用创建,不存在就会创建一个新的AppDomain对象后加载asp.net执行时期所需要的Assemblys及访问者所要求的其它文件.所以说IIS中AppDomain的数量与访问过Asp.net虚拟目录数相同的.
然后aspnet_wp.exe会将请求传送给AppDomain中ISAPIRuntime对象,ISAPIRuntime对象由ISAPI封包中解出信息后再转交给HttpRuntime对象,接着会调用HttpRuntime.ProcessRequest函数处理用户的请求.HttpRuntime.ProcessRequest会创建HttpContext对象,并且将会管理HttpContext与Cache(暂不清楚由谁创建,可能由IIS分配).在HttpContext创建后,HttpRuntime再将请求送入到HttpApplicationFactory容器中,由HttpApplicationFactory创建一个HttpApplication对象,在创建HttpApplication对象前HttpApplicationFactory会先解译目录中的Global.asax文件,接着加载虚拟目录中的Application Assembly(Global.dll),然后合并两者创建出GhostApplicationClass,最后编译些Class后取得对象返回给httpRuntime对象,这个取得的对象也就是HttpApplication对象.接着HttpRunTime将请求较交给HttpApplication对象处理.在这里我有个疑问,不知道ApplicationAssembly(Global.dll)是不是虚拟目录中Bin下面所有的dll文件?还请大家解答一下!
当HttpApplication创建完后,httpRuntim对象会调用HttpApplication.ProcessRequest函数来处理请求,在这里黄忠成先生所讲的是HttpApplication.ProcessRequest函数将请求转交给对应的HttpHandler对象来处理,然后再补充在HttpApplication初始化期间,相关的HttpModules模块才被加载,但HttpModules真正功能确没讲多少,也只是点到为止.的确是个遗憾.后来我在其它资料发现HttpApplication.ProcessReques并不是直接将请求转交给HttpAppliction对象,而是先经过HttpModules模块的处理,也就是说,HttpModeules是请求的必经之路.在HttpModules模块中有相应的事件处理,其中有一事件是HttpModule.PreRequestHandlerExecute(),这一事件处理完后,才进入httpHandler,然后HttpHandler才能处理请求,处理完后将结果返回到HttpModules中,接着再运行HttpModule.PostRequestHandlerExecute(),和其它的模块事件,直到整个请求结束.所以可以这么说HttpHandler是在HttpModules中运行的.
今天先贴第一节的第一部分,讲到一个请求从客户端到IIS最后由HttpHandler来处理,感觉自己对这部分请求流程有了一定的认识,但对Ghost ApplicationClass的创建过程,也就是HttpApplication对象创建的一些细节不是很清楚,希望大家对这一块能谈一下自己的认识,让我也学习学习. |
|