ASP.NET 4应用程序中的双应用程序域

时间:2012-06-06 22:05:19

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

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

  • 这些双域将持续一段时间。
  • 如果由于网络配置或二进制更改而发生回收,则两个应用域都将关闭,并且会启动两个新域。
  • 这些服务器每天需要使用几个二进制补丁和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

4 个答案:

答案 0 :(得分:7)

  1. 即使您没有创建AppDomain,您正在使用的库也可能是。{li>

    您使用的是哪些第三方组件?您是否有任何可能负责的Inversion of Control或动态代理库?以下是对Castle的解释。

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

  3. 如果您正在利用ASP.NET的动态编译和卷影复制功能,ASP.NET有时会有多个AppDomain。 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" />来禁用阴影复制。

  4. 更新

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

答案 1 :(得分:2)

请查看您的ApplicationHost.config

看看:maxProcesses它应该是1。

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

答案 2 :(得分:0)

根据以下答案https://stackoverflow.com/a/3318367/2001769的建议 在另一个线程中,似乎ASP.NET运行时保留了一个HttpApplication实例池(不管maxProcesses / Web Garden)。

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

答案 3 :(得分:0)

如果有多个IIS应用程序定位到同一路径。如果调用该应用程序,将根据此类IIS应用程序创建AppDomain。

例如:

如果两者都以相同的路径为目标,则仍将其视为两个不同的应用程序,并将创建两个AppDomain。