基本概念:

1. 站点程序:在IIS中我们所新建的站点,可以为其配置ASP.net以及应用程序池的版本。

2. 虚拟目录:用来将不同的文件夹中的内容通过虚拟目录组织到同一个文件夹中,相当于一个应用程序,也对应着一个应用程序池。

3. 应用程序池:《微软概念》是将一个或多个应用程序连接到一个或多个工作进程集合的配置。因为应用程序池中的应用程序与其他应用程序被工作进程边界分隔,所以某个应用程序池中的应用程序不会受到其他应用程序池中的应用程序所产生的问题的影响。

4. 工作进程隔离模式:防止一个应用程序或站点停止了而影响另一个应用程序或站点。应用程序池直接从内核接收请求而非WWW服务。

5. W3WP.exe是IIS的工作进程池,每一个w3wp.exe是IIS的一个web园,一般在IIS6.0中出现,一般的工作进程池只有一个web园,但是如果在工作进程池的web园中最大工作进程数被修改可能出现多个w3wp.exe,或者多个工作进程池同事工作也可能出现多个w3wp.exe。它的启动用户是系统内置安全账户network service。

6. Web Gargen:指一个应用程序可以再多个进程(w3wp.exe)中来执行,一次请求使用其中的一个。用这个的主要目的是提高程序的可用性。当其中一个进程发生错误,那么也不会影响其他进程。发生错误的进程可以根据规则关闭,而其他的进程则可以继续工作。

对于IIS6,IIS7,每个应用程序池都会创建一个w3wp.exe进程。但是并不是所有情况都是一个应用程序池对应一个w3wp.exe进程。web garden。或者一些异常发生的时候,就会一个应用程序池对应多个w3wp.exe进程。应用程序池会在没有请求的时候定时回收,或者发生错误的时候,自动重新建立一个处理进程w3wp.exe进程,如果运气好,就会看到没有配置web garden时,一个应用程序池对应多个w3wp.exe进程。

同样可以对虚拟目录来设置应用程序池,设置方法和设置站点的应用程序池是一样的。同样也可以进行Web Gargen的配置。

在应用程序池的属性选项卡中,能找到关于IIS对于w3wp进程的监控功能,它提供时间参数设置(隔多少时间来ping一次工作进程),在多少时间内未返回值则将此进程视为timeout,或者死掉的状态,具体数值可以再IIS手册中查到相关值,此时我们可以通过使用程序语言读取系统日志文件来跟踪到此进程的ID,之后可以使用IISAPP.vbs得到该进程对应的应用程序池,从而可以定位到该程序池所对应的应用程序以及可以通过对应用程序池操作来恢复此故障。

关于HTTP请求的处理(ASP级别)

IIS 6的ASP.net请求处理过程:

IIS5.X是通过Inetlnfo.exe监听request并把request分发到work process。换句话说,在IIS5.X中对request的监听和分发是在user mode中进行,在IIS6中,这种工作被移植到kernel mode中进行,所有的这一切都是通过一个新的组件:http.sys来负责。

PS:免用户应用程序访问或者修改关键的操作系统数据,windows提供了两种处理器访问模式:用户模式(User Mode)和内核模式(kernel mode)。一般地,用户程序运行在user mode下,而操作系统代码运行在kernel mode下,kernel mode的代码允许访问所有系统内存和所有CPU指令。在user mode下,http.sys接收到一个机遇aspx的http request,然后它会根据IIS中的Metabase查看该基于该request的application属于哪个application pool,如果该application pool不存在,则创建之,否则直接将request发送到对应的application pool的queue中。每个application pool对应着一个worker processs:w3wp.exe,毫无疑问他是运行在user mode下的。在IIS Metabse中维护着application pool 和 worker process的Mapping,WAS(Web Administrative Service根据这样一个mapping,将存在于某个application poos queue的request传递到对应的worder process(如果没有,就穿件一个这样的进程)。在worker process初始化的时候,加载ASP.net ISAPI,asp.net ISAPI进而加载CLR,通过APPManagerAppDomainFactory的Create方法为Application穿件一个Application Domain,通过ISAPIRuntime的ProcessRequest处理Request,进而将流程进入到ASP.net http runtime pipeline。