对 .NET Framework 应用程序最重要的要求之一就是可靠性。有应用程序运行在服务器进程中的结构(在 IIS 中,Inetinfo.exe)并不会为建立可靠的、能够长时间运行的应用程序产生一个坚实的基础。在进程级别上共享许多资源,一个错误就会很容易导致整个服务器进程终止。
为了解决这个问题,ASP.NET 提供了一个进程外执行模型 Aspnet_wp.exe,用来保护服务器进程免受用户代码干扰。它也能够使试探法应用于进程的生存期以提高 Web 应用程序的可用性。使用异步进程间通信能够在性能、可伸缩性和可靠性之间提供最佳的平衡。
在计算机的根配置文件 Machine.config 中公开了进程模型设置。配置节命名为 <processModel> 元素并如下例所示。在运行 Windows 2000 和 Windows XP 的计算机上,默认情况下,进程模型是启用的 (enable="true"
)。
注意 在运行 Windows Server 2003 的计算机上,默认情况下,ASP.NET 运行在 IIS 6.0 工作进程隔离模式下。如果应用程序是在特定的 ASP.NET 进程模型设置下设计的,要在 Windows Server 2003 上使用它们,则必须将服务器配置在 IIS 5.0 隔离模式下运行。详细信息,请参阅配置隔离模式。
<processModel
enable="true"
timeout="Infinite"
idleTimeout="Infinite"
shutdownTimeout="0:00:05"
requestLimit="Infinite"
requestQueueLimit="5000"
restartQueueLimit="10"
memoryLimit="60"
webGarden="false"
cpuMask="0xffffffff"
userName="machine"
password="AutoGenerate"
logLevel="Errors"
clientConnectedCheck="0:00:05"
comAuthenticationLevel="Connect"
comImpersonationLevel="Impersonate"
responseRestartDeadlockInterval="00:09:00"
responseDeadlockInterval="00:03:00"
maxWorkerThreads="20"
maxIoThreads="20"
/>
本示例中的大多数配置设置用于控制新的工作进程何时开始处理请求(正常代替旧的工作进程)。userName 和 password 属性定义在 ASP.NET 工作进程中运行的帐户。相应的默认值分别为 machine 和 autogenerate。这些值告诉 ASP.NET 使用内建的 ASPNET 帐户并为该帐户使用存储在本地安全机构 (LSA) 中的加密的强随机密码。
注意 在运行 Windows Server 2003 的计算机上,默认情况下,ASP.NET 使用默认标识 NETWORK SERVICE 并作为 IIS 6.0 (W3wp.exe) 进程的一部分运行。如果在运行 Windows Server 2003 的计算机上配置了 IIS5 隔离模式,ASP.NET 工作进程就会以 ASPNET 帐户运行。
如果想获得更高特权的进程,可以将 userName 属性设置为 System,这会使 ASP.NET 工作进程以与 Inetinfo.exe 进程相同的标识运行。在默认情况下,该进程以 System 标识运行。当这样配置后,ASP.NET 工作进程将具有访问本地服务器上几乎所有资源的权利。在 Windows 2000、Windows XP 和 Windows Server 2003 家族系统中,System 帐户也具有网络凭证并可作为机器帐户访问网络资源。
警告 将 userName 属性更改为 System 后,可以访问和更改计算机上几乎所有的资源,从而给计算机带来明显的安全风险。
下例更改了 Machine.config 文件的 <processModel> 部分中的 userName 属性,使进程以 System 身份运行。
<processModel userName="system" password="autogenerate" />
进程模型支持两种回收类型:被动型和主动型。
当进程不能正常工作或不能处理请求时,就会发生被动型进程回收。进程通常会显示可检测到的症状,例如死锁、访问冲突、内存泄漏等,以触发进程回收。通过使用 requestQueueLimit、memoryLimit 和 shutdownTimeout 配置属性,可以控制导致进程重新启动的条件。有关这些属性的详细信息,请参阅 <processModel> 元素配置节。
主动型进程回收周期性地重新启动工作进程,即使进程运行状况良好。对于在进程模型不能检测到的情况下避免发生拒绝服务,这是一种很有用的方法。在指定的请求次数后或超时时间已过,进程能够重新启动。通过使用 timeout、idleTimeout 和 requestLimit 配置属性,可以启用主动型进程回收。详细信息,请参阅 <processModel> 元素配置节。
当发生进程回收时,进程模型将事件记录到 Windows 事件日志中。这是由 logLevel 配置属性控制的。详细信息,请参阅 <processModel> 元素配置节。
当回收事件发生时,如果为该事件启用了日志,则下列的条目将记录到应用程序事件日志中。
关机原因 | 事件日志类型 | 描述 |
---|---|---|
Unexpected | 错误 | ASP.NET 工作进程意外关机。 |
RequestQueueLimit | 错误 | ASP.NET 工作进程重新启动,因为超出了请求队列限制。 |
RequestLimit | 信息 | ASP.NET 工作进程重新启动,因为超出了请求限制。 |
Timeout | 信息 | ASP.NET 工作进程重新启动,因为满足了超时间隔条件。 |
信息 | ASP.NET 工作进程重新启动,因为满足了空闲超时间隔条件。 | |
MemoryLimitExceeded | 错误 | ASP.NET 工作进程重新启动,因为超出了进程内存限制。 |
进程模型通过将工作分发给几个进程来帮助启用多处理器计算机上的可扩展性,每个 CPU 各分配一个进程,每个进程的处理器关系都设置到其自己的 CPU 上。这就消除了交叉处理器的锁定竞争,对于大型的对称多重处理 (SMP) 系统十分理想。这项技术称为 Web 园。要启用 Web 园,需要设置 <processModel> 元素中的 cpuMask 和 webGarden 配置设置。下面的示例在运行 ASP.NET 的服务器上启用 Web 园。
<configuration>
<system.web>
<processModel
enable="true"
timeout="15"
webGarden="true"
maxWorkerThreads="25"
maxIoThreads="25"/>
</system.web>
</configuration>
Web 园有一些应该注意的副作用: