防止IIS重复使用单独的ASP.Net AppDomains的工作进程

时间:2010-09-21 11:48:51

标签: asp.net iis appdomain w3wp worker-process

当IIS重新启动ASP.Net(2.0)Web应用程序时,它可以:

  • 回收AppDomain :卸载AppDomain并在相同进程中加载​​新的AppDomain(例如,当调用HttpRuntime.UnloadAppDomain()时,更改web.config时)。
  • 回收流程:卸载AppDomain并在 new 进程上加载新的(例如,通过inetmgr在AppPool上调用Recycle命令时,或者当内存限制为到达)。

由于某些内部原因(我们依赖的遗留本机代码存在问题),我们不能允许第一个选项。我们无法在同一进程中加载​​应用程序两次。

可以以某种方式告诉IIS永远不允许工作进程重用吗?

我已经尝试通过跟踪应用程序是否已经使用互斥锁启动过程来自行预防,如果是这样的话 - 在Application_Start()期间抛出异常);我还尝试在Environment.Exit()期间致电Application_End()来终止此流程。这两种方法的问题在于它会导致在Application_End或Application_Start期间到达的任何请求失败(与手动进程回收不同,它完全没有请求,因为它们会立即重定向到新进程)。

2 个答案:

答案 0 :(得分:0)

我相信“回收AppDomain”是在ASP.NET运行时的预览下进行的,并且IIS并没有真正涉及到任何地方(在IIS7的集成管道中我不是100%确定)。所以我不认为你想要的是可行的。但是您可以考虑针对您的问题采取一些解决方法:

  1. 确保您运行启动代码(操作遗留代码)只运行一次 - 这应该可以通过命名系统semaphores实现。一旦系统信号量由应用程序启动在工作进程中创建,它将一直存在,直到进程被回收,因此您可以对每个进程进行初始化。

  2. 如果#1不可能,则考虑托管代码在一个单独的进程中共同操作遗留代码 - 此过程可以通过命名管道通过WCF服务公开相关功能。 ASP.NET将使用它们来使用遗留代码。

答案 1 :(得分:0)

找不到告诉IIS不要重用工作进程的方法。无法承担修复禁止流程重用的潜在问题。因此,最终在Environment.Exit(0)中调用了Application_End,尽管可能会因连接重置而导致少量请求失败。