【问题标题】:Prevent IIS from reusing worker processes for separate ASP.Net AppDomains防止 IIS 为单独的 ASP.Net AppDomain 重用工作进程
【发布时间】:2010-09-21 11:48:50
【问题描述】:

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

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

由于一些内部原因(我们依赖的遗留原生代码存在问题),我们不能允许第一个选项。我们只是不能在同一个进程上两次加载应用程序。

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

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

【问题讨论】:

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


    【解决方案1】:

    我相信“Recycle the AppDomain”在 ASP.NET 运行时的预览下,并且 IIS 并没有真正涉及任何地方(在 IIS7 的集成管道的情况下,我不能 100% 确定这一点)。所以我不认为你想要的是可行的。但是您可以考虑以下几种解决方法来解决您的问题:

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

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

    【讨论】:

    • 首先,感谢您的回复。不幸的是,由于项目的后期阶段,#2是不可能的。我用系统互斥锁尝试了#1,但是问题
    • *但我没有考虑跳过初始化(我只考虑“阻止”同一进程上的其他启动,但这导致一些第一个请求失败)。我会试试的。
    • 不幸的是,#1 也被证明是不可能的(不能跳过初始化,因为一旦应用重新启动,其中一些实际上是必需的)。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-02-07
      • 2011-01-07
      • 1970-01-01
      • 2018-11-12
      • 1970-01-01
      • 2013-02-06
      • 2016-09-20
      • 2015-01-04
      • 2012-01-28
      相关资源
      最近更新 更多