【问题标题】:Double App Domains in ASP.NET 4 applicationASP.NET 4 应用程序中的双应用程序域
【发布时间】:2012-06-10 23:39:40
【问题描述】:

我有一个在 IIS 7 上运行的具有多个应用程序域的 ASP.NET 应用程序,我无法理解为什么单个进程中有多个应用程序域。我已经掌握了我的代码库,并且没有明确地创建第二个应用程序域。回收是否有可能超时?

  • 这些双域将持续一段时间。
  • 如果由于 Web 配置或二进制更改而发生回收,则两个应用程序域都将关闭,并且将启动两个新的应用程序域。
  • 这些服务器每天都会受到多个二进制补丁和 IISResets 的影响 - 有时有 2 个域,有时只有 1 个。
  • 网络园艺已禁用。
  • 我发现这一点是因为应用程序中有一个计时器向数据库发送心跳,并注意到有一天服务器有两次心跳。

在 windbg 中,!dumpdomain 向我显示以下结果:(过滤为仅显示应用程序域的名称):

Line 59: Name:               None
Line 66: Name:               None
Line 372: Name:               DefaultDomain
Line 460: Name:               /LM/W3SVC/1/ROOT/MyAppDomain-1-129882892717131250
Line 4437: Name:               /LM/W3SVC/1/ROOT/MyAppDomain-4-129285605131450579

【问题讨论】:

  • 迷人 :) 当您在 IIS 管理器中打开应用程序池时,选择运行此应用程序的池,然后在 RHS 的“操作”窗格中选择“查看应用程序”,列出了多少个应用程序?
  • 好电话 - 只有一个应用程序。
  • 会不会是 IIS 中的一些压力管理?在令人头疼的负载下 - 创建额外的 appDomain,否则要杀死不需要的?或者与快速故障安全保护有关的东西?类似的讨论:stackoverflow.com/questions/8979032/…
  • 这可能是回收的结果,它们会持续多久? (如果你甚至可以检查)。也许您可以使用 Applicin_End 事件以某种方式检查这一点?
  • 小时 - 这就像强制卸载应用程序域的 90 秒计时器永远不会完成,或者应用程序域被卡住试图卸载。

标签: asp.net iis-7 .net-4.0 appdomain


【解决方案1】:

不妨看看你的ApplicationHost.config

看看:maxProcesses应该是1。

您的 IIS 似乎启动了多个工作进程。

【讨论】:

    【解决方案2】:
    1. 即使您没有创建AppDomain,您正在使用的库也可能是。您正在使用哪些第三方组件?您是否有任何可能负责的控制反转或动态代理库?这是Castle 发生的这种情况的解释。

    2. 您确定应用程序只在 IIS 中的一个地方运行吗?可能有多个 IIS 站点/应用程序从同一个文件运行。这与 (1) 从数据库而不是应用程序获取调试信息以及 (2) 由于编辑 web.config 导致重复域一致导致回收是一致的。如果一个位置比另一个更常访问,这可以解释为什么有时只有一个 AppDomain

    3. 如果您使用 ASP.NET 的动态编译和卷影复制功能,ASP.NET 有时会有多个 AppDomains。 Jim Schubert 写了一篇名为 ASP.NET, AppDomains, and shadow-copying 的文章,其中更详细地解释了这一点,并就如何修改 web.config 以对其进行自定义提出了一些建议。他在Does my ASP.NET application stop executing if I overwrite the DLLs? 上也有一个有用的答案,可以通过设置<hostingEnvironment shadowCopyBinAssemblies="false" /> 来禁用影子复制。

    更新

    我被 Jim Schubert 的博客吸引,最后在 Allowing Only A Single Instance of a .NET application 上阅读了这篇无关的帖子。如果一切都失败了,您可以使用这种方法来确保只有一个应用程序实例正在运行。

    【讨论】:

      【解决方案3】:

      正如以下答案https://stackoverflow.com/a/3318367/2001769所建议的那样 在另一个线程中,似乎 ASP.NET 运行时保留了一个 HttpApplication 实例池(与 maxProcesses / Web Garden 无关)。

      我不知道是否有可能,甚至是可取的,来控制这个池。最佳实践可能是在 Application_Start 事件中实例化所有应用程序单例,该事件应该每个应用程序只运行一次,而不是每个池化 HttpApplication 实例运行一次。

      【讨论】:

        【解决方案4】:

        如果有多个 IIS 应用程序针对同一路径。如果调用应用程序,将为每个此类 IIS 应用程序创建一个 AppDomain。

        例如:

        如果两者都针对相同的路径,它们仍然算作两个不同的应用程序,并且将创建两个 AppDomain。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-05-23
          • 2014-08-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-31
          • 1970-01-01
          相关资源
          最近更新 更多