众所周知,一个完整的动态网页的从请求到响应无非包括以下3个步骤:
1、浏览器客户端发出http请求。
2、IIS服务端接受请求。
3、处理请求并输出请求结果到浏览器客户端。
首先,简单的说说我所理解的IIS,它依赖于Windows服务World Wide Web Publish Service的,并依赖于进程w3wp.exe的。也就是说IIS的运行离不开工作进程w3wp.exe,同时每个IIS站点下的应用程序都是被用用程序池进行隔离,应用程序池即w3wp.exe的容器,通过池隔离的机制保证当某个应用程序池出错即网站出现错误或进程资源回收时候,不会影响到其他应用程序池中的应用正常访问,接下来说说具体的IIS处理细节:
1、从IIS6.0版本开始,引入了文件HTTP.SYS(一个位于Win2003和WinXP SP2中核心组件,据我了解支持IIS的操作系统中均有此文件,它能够让任何应用程序通过它提供的接口,以http协议进行信息通讯)。当浏览器发出请求地址,地址自动解析到某台IP对应的服务器,该服务器中的IIS站点会自动触发文件HTTP.SYS,此时的HTTP.SYS会自动寻找到对应的应用程序池ID,这里的应用程序池ID是在开发者活实施人员部署这个站点站点之后已自动注册到HTTP.SYS,所以HTTP.SYS才能准确的应用程序池定位。因此一个HTTP.SYS是对应到多个应用程序池的。
2、当应用程序池接收到用户发来的请求后,会接着传给工作进程,即w3wp.exe进程,该进程检查来请求的URL后缀以确定加载哪个ISAPI扩展。ASP.NET加载时会附带自己的ISAPI扩展(aspnet_isapi.dll),以便在IIS中映射,这个映射可以在IIS的管理中心进行配置与查看。
3、一旦工作进程加载了aspnet_isapi.dll, 就会构造一个HttpRuntime类,该类是应用程序的入口,通过ProcessRequest方法处理请求。
4、方法ProcessRequest被调用后,一个HTTP上下文对象即HttpContext的实例就产生了。可通过HTTPContent.Current获取到这个实例,且该实例会在整个生命周期中存活,我们通过它可以获取到一些常用对象,如Request,Response,Session 等。
5、之后HttpRuntime会通过HttpApplicationFactory类加载一个HttpApplication对象。每一次请求都要穿过一堆HttpModule到达HttpHandler,以便被响应。而这些HttpModule就被配置在HttpApplication中。同时,开发者也可自定义HttpModule从而来完成一些特殊的http拦截与相应的处理。
6、所有请求穿过HttpModule需抵达相应的HttpHandler,然后HttpHandler根据请求资源,产生并输出内容。
完成整个步骤后,ASP.NET页面生命周期就开始了。
个人总结:对于IIS处理机制的理解有助于加深开发人员对于Form验证、windows验证模式、HTTP拦截处理的原理的认识,以及IIS网站的性能的优化都会有一定的指导作用。