我在IIS 7上运行了一个运行多个应用程序域的ASP.NET应用程序,我无法理解为什么单个进程中有多个应用程序域。我已经使用了我的代码库,而且我没有明确地创建第二个应用程序域。回收可能没有超时吗?
在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
答案 0 :(得分:7)
即使您没有创建AppDomain
,您正在使用的库也可能是。{li>
您使用的是哪些第三方组件?您是否有任何可能负责的Inversion of Control或动态代理库?以下是对Castle的解释。
您确定应用程序仅在IIS中的一个位置运行吗?可以让多个IIS站点/应用程序运行相同的文件。这与(1)从数据库而不是应用程序获取调试信息一致,以及(2)由于编辑web.config
导致重复的域导致的回收。如果一个位置比另一个位置更常见,这可以解释为什么有时只有一个AppDomain
。
如果您正在利用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" />
来禁用阴影复制。
我被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。