18

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

  • 这些双域将持续一段时间。
  • 如果由于 Web 配置或二进制更改而发生回收,则两个应用程序域都将关闭,并且将启动两个新的应用程序域。
  • 这些服务器每天都会受到多个二进制补丁和 IISReset 的影响——有时有 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
4

4 回答 4

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

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

  3. 如果您正在利用 ASP.NET 的动态编译和卷影复制功能,ASP.NET 有时会有多个AppDomains. Jim Schubert 写了一篇名为ASP.NET、AppDomains 和 shadow-copying的文章,其中更详细地解释了这一点,并就如何修改web.config以自定义它提出了一些建议。如果我覆盖 DLL ,我的 ASP.NET 应用程序会停止执行吗? 可以通过设置禁用卷影复印<hostingEnvironment shadowCopyBinAssemblies="false" />

更新

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

于 2012-06-15T01:13:11.810 回答
2

可以看看你的ApplicationHost.config

看看:maxProcesses应该是1。

看来您的 IIS 启动了多个工作进程。

于 2012-06-12T22:46:25.273 回答
0

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

例如:

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

于 2016-10-26T11:47:44.787 回答
0

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

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

于 2016-01-05T10:10:21.543 回答