不管使用哪种底层平台可靠性和性能都是对所有 Web 应用程序的主要要求尽管从某种意义上讲这两个要求是相互矛盾的例如要构建更可靠更健壮的应用程序可能需要将 Web 服务器与具体的应用程序分离使应用程序在进程外工作但是如果在不同于 Web 服务器进程的内存环境中工作应用程序将变慢因此需要采取合理的措施以确保进程外代码尽可能快地运行
在构建 Microsoft? ASPNET 运行时环境时依据的设计原则即充分考虑可靠性和性能得到的 ASPNET 进程模型包含了两个系统元素 一个存在于 Web 服务器进程中的进程内连接器一个外部的辅助进程另外ASPNET 运行时结构的可伸缩能力很强可以自动使用多处理器硬件中任意选定的处理器这种模式被称为Web Garden它可以使多个辅助进程同时运行而且各个进程均在独立的处理器中
高度概括起来ASPNET 运行时具有三大属性
应用程序和 ASPNET 辅助进程之间完全分离提供服务的辅助进程的寿命决不会影响应用程序的寿命换句话说当应用程序启动并处于运行状态时辅助进程可以随时终止
尽管 ASPNET 应用程序从不在 Web 服务器内采用进程内的方式运行但大多数情况下其总体性能仍接近于进程内应用程序的性能
为 Web Garden 体系结构提供了内置的和可配置的支持只要简单检查一下配置文件中的设置辅助进程就可以克隆自己以利用所有与进程密切相关的 CPU因此在大多数情况下您在具备多处理器的计算机中获得的可缩放性将呈线性增长的趋势(本文后面将详细介绍此内容)
本文将介绍 ASPNET 运行时环境的组成元素然后一步一步地讲述从 URL 请求变为纯 HTML 文本的漫长而曲折的过程
除非另有说明否则以下介绍中均指 ASPNET 的默认进程模型即 Microsoft? Internet Information Services (IIS) x 中唯一的模型
一ASPNET 结构的组件
执行 ASPNET 应用程序需要宿主 Web 服务器的支持在 Microsoft? Windows? 的 Server 平台中Web 服务器由名为 inetinfoexe 的 IIS 可执行文件表示Windows 及以上版本的操作系统本身均提供了 Web 服务器但需要注意在 Microsoft? Windows Server&#; 中并未默认安装 IIS 和 ASPNET必须通过单击控制面板中的添加或删除程序小程序将其添加到系统中
IIS 是一个未托管的可执行程序它提供了一个基于 ISAPI 扩展模块和筛选器模块的可扩展模型通过编写此类模块开发人员可以直接管理对特定资源类型的请求并在各个预定义的步骤中接收当前请求扩展和筛选器是一些 DLL可以导出一些具有已知名称和签名的函数这些插件组件是在 IIS 配置数据库中注册并配置的
只有少数几种被客户端请求的资源类型由 IIS 直接处理例如对 HTML 页面文本文件JPEG 和 GIF 图像的传入请求由 IIS 处理对 Active Server Page (*asp) 文件的请求通过调用名为 aspdll 的 ASP 专用扩展模块进行解析同样对 ASPNET 资源(例如*aspx*asmx*ashx)的请求将传递到 ASPNET ISAPI 扩展该系统组件是一个名为 aspnet_isapidll 的 Win DLLASPNET 扩展可以处理多种资源类型包括 Web 服务和 HTTP 处理程序调用
ASPNET ISAPI 扩展是一个 Win DLL未集成托管代码它是接收和分派对各种 ASPNET 资源的请求的控制中心按照设计该模块存在于 IIS 进程中在具有管理员权限的 SYSTEM 帐户下运行开发人员和系统管理员不能修改此帐户ASPNET ISAPI 扩展负责调用 ASPNET 辅助进程 (aspnet_wpexe)而该进程又负责控制请求的执行除了对请求进行安排以外ASPNET ISAPI 还监视辅助进程的运行情况并在性能降低到一定程度时将进程取消
辅助进程是一小段 Win shell 代码集成了公共语言运行库 (CLR) 并运行托管代码它负责处理对 ASPXASMX 和 ASHX 资源的请求一般来说此进程在一台给定的计算机中只有一个实例所有当前激活的 ASPNET 应用程序均在其中运行每个应用程序都位于一个独立的 AppDomain 中但是如前所述辅助进程支持 Web Garden 模式即进程的相同副本都运行在与进程密切相关的 CPU 中(更多内容请参阅本文后面的Web Garden 模型部分)
ISAPI 和辅助进程之间的通讯是使用一组命名管道进行的命名管道是一种 Win 机制用于跨进程边界传输数据顾名思义命名管道的工作方式与管道相似在一端输入数据在另一端输出相同的数据建立的管道既可以连接本地进程也可以连接远程计算机上运行的进程对于本地进程间通讯管道是 Windows 中的最有效最灵活的工具
为确保获得最优性能aspnet_isapi 使用异步命名管道来将请求转发给辅助进程并获得响应另一方面辅助进程在需要查询有关 IIS 环境的信息(即服务器变量)时又使用同步管道aspnet_isapi 模块创建固定数量的命名管道并使用重叠的操作以通过小的线程池处理同一时间进行的连接当通过管道进行的数据交换操作结束后完成例程将断开客户端并重新使用管道实例为新的客户端服务线程池和重叠操作均可以保证使 ASPNET ISAPI 的性能达到令人满意的水平但是aspnet_isapi 扩展决不会处理 HTTP 请求
ASPNET 请求的处理逻辑可以概括为以下步骤
当请求到达时IIS 检查资源类型并调用 ASPNET ISAPI 扩展如果启用了默认的进程模型aspnet_isapi 会将请求排队并将请求分配给辅助进程所有的请求数据都通过异步 I/O 发送如果启用了 IIS 进程模型请求将自动在辅助进程 (wwpexe) 中排队此辅助进程用于处理应用程序所属的 IIS 应用程序池IIS 辅助进程不了解 ASPNET 和托管代码的任何情况它只是处理 *aspx 扩展并加载 aspnet_isapi 模块当 ASPNET ISAPI 在 IIS 进程模型中运行时它的工作方式有所不同仅在 wwpexe 辅助进程的上下文中加载 CLR
收到请求后ASPNET 辅助进程将通知 ASPNET ISAPI它将为请求服务通知通过同步 I/O 实现之所以使用同步模型是因为请求只有在 ISAPI 内部请求表中被标记为executing辅助进程才能开始处理它如果请求已经由特殊的辅助进程进行处理则不能再将它指定到其他进程除非原始进程已取消
在辅助进程的上下文中执行请求有时辅助进程可能需要回调 ISAPI 以完成请求也就是需要说枚举服务器变量这种情况下辅助进程将使用同步管道因为这样可以保持请求处理逻辑的顺序
完成后响应被发送到打开了异步管道的 aspnet_isapi现在请求的状态变为Done之后将从请求表中被删除如果辅助进程崩溃正在处理的所有请求仍将保持executing状态并持续一段时间如果 aspnet_isapi 检测到辅助进程已取消它将自动终止请求并释放所有相关的 IIS 资源
以上说明是指默认的 ASPNET 进程模型即在 IIS x 中运行的工作模型IIS (Windows Server 提供)的默认工作方式对 ASPNET 进程模型也有影响当集成在 IIS 中时ASPNET 会自动调整自己的工作方式以适应宿主环境这时不再需要使用 aspnet_wp 辅助进程machineconfig 文件中定义的某些配置参数也被忽略从 ASPNET 的角度来看IIS 的最大改变是有关请求的一切都在 aspnet_isapi 的控制之下且都处在 wwpexe 辅助进程的上下文中辅助进程的帐户是为 Web 应用程序所属的应用程序池设置的帐户默认情况下该帐户是 NETWORKSERVICE&#它是一个内置的弱帐户在功能上与 ASPNET 等价
辅助进程受一个名为进程回收 (Recycling) 的功能的控制进程回收具有 aspnet_isapi 功能当现有进程消耗的内存太多响应太慢或挂起时可以自动启动新进程出现这种情况时新请求将由新实例处理新实例从而变成新的活动进程但是指定给旧进程的所有请求仍保持挂起状态如果旧进程结束了挂起的请求并进入空闲状态该进程即终止如果辅助进程崩溃或者由于其他原因停止处理请求则所有挂起的请求将被重新指定给新进程
尽管 ASPNET ISAPI 和辅助进程是 ASPNET 运行时结构的主要组成部分但还有其他一些可执行文件也发挥着作用下表列出了所有这些组件
表 构成 ASPNET 运行时环境的可执行文件
名称类型帐户aspnet_isapidllWin DLL(ISAPI 扩展)LOCAL SYSTEM aspnet_wpexeWinEXE ASPNET aspnet_filterdllWin DLL(ISAPI 筛选器)LOCAL SYSTEM aspnet_stateexeWin NTService ASPNET
aspnet_filterdll 组件是一个小的 Win ISAPI 筛选器用来备份 ASPNET 应用程序的无 Cookie 会话状态在 Windows Server 中当启用 IIS 进程模型时aspnet_filterdll 还将筛选出 Bin 目录中对非可执行资源的请求
aspnet_stateexe 的作用对 Web 应用程序更为重要因为它用于管理会话状态该项服务是可选的可以用来在 Web 应用程序内存空间之外保存会话状态数据该可执行文件是一种 NT 服务既可以在本地运行也可以远程运行当该服务被激活后可以将 ASPNET 应用程序配置为将所有会话信息保存在此进程的内存中一种类似的方案是提供更为可靠的数据存储方式不受进程回收和 ASPNET 应用程序故障的影响该服务在 ASPNET 本地帐户下运行但可以使用服务控制管理器 (Service Control Manager) 接口来配置它
另一个应该介绍的可执行文件是 aspnet_regiisexe尽管严格来讲它并不属于 ASPNET 运行时结构该实用程序可以用来配置环境以在一台计算机上并行执行不同版本的 ASPNET还可用于维修 IIS 和 ASPNET 损坏的配置该实用程序的工作方式是更新存储在 IIS 配置数据库的根目录和子目录中的脚本映射脚本映射是资源类型和 ASPNET 模块之间的一种关联关系最后还可以使用该工具来显示已安装的 ASPNET 版本的状态执行其他配置操作如授予对特定文件夹的 NTFS 权限创建客户脚本目录
二Web Garden 模型
Web Garden 模型可以通过 machineconfig 文件中的 <processModel> 部分进行配置请注意<processModel> 部分是唯一不能放在应用程序特定的 webconfig 文件中的配置部分这就是说Web Garden 模式可以应用到计算机中运行的所有应用程序但通过使用 machineconfig 源文件中的 <location> 节点可以针对各个应用程序调节计算机的设置
<processModel> 部分有两个属性可以影响 Web Garden 模型它们是 webGarden 和 cpuMaskwebGarden 属性接受布尔值表示是否使用了多个辅助进程(一个相关的 CPU 对应一个进程)默认情况下该属性的值为 falsecpuMask 属性保存一个 DWORD 值该值的二进制表示为能够运行 ASPNET 辅助进程的 CPU 提供了位屏蔽其默认值为 (xFFFFFF)表示可以使用所有可用的 CPU如果 webGarden 属性为 false则 cpuMask 属性的内容将被忽略cpuMask 属性还为正在运行的 aspnet_wpexe 的副本数设置了上限
常言道闪光的不都是金子用在这里很合适Web Garden 模式使得多个辅助进程可以同时运行但是需要注意的是所有进程都会有自己的应用程序状态进程内会话状态ASPNET 缓存静态数据以及运行应用程序所需的其他内容启用 Web Garden 模式之后ASPNET ISAPI 将根据 CPU 的数量尽可能多地启动辅助进程每个辅助进程都是下一进程的完整克隆(每一进程都与相应的 CPU 密切相关)为平衡工作负荷传入的请求以单循环的方式在运行的进程之间进行划分辅助进程就象在单处理器中一样被回收请注意ASPNET 继承了操作系统中所有的 CPU 使用限制并且不包括实现限制的自定义语义
总之Web Garden 模型并不适用于所有应用程序应用程序的状态越多其的性能损失也越多工作数据存储在共享内存的块中以便一个进程输入的变化可以立即被其他进程得知但是处理请求时工作数据被复制到进程的上下文中因此各个辅助进程将处理自己的工作数据而应用程序的状态越多性能损失就越大鑒于此仔细明智的应用程序基准测试是绝对必要的
只有重启 IIS 后对配置文件中 <processModel> 部分所做的更改才会生效在 IIS 中Web Garden 模式的参数保存在 IIS 配置数据库中webGarden 和 cpuMask 属性被忽略