14

如果在同一个应用程序池中运行多个 ASP.NET 应用程序,我将拥有多少个类的静态变量实例?

  1. 每个应用程序池一个?
  2. 每个应用程序池工作进程一个?
  3. 每个应用程序一个?
  4. 还有什么?

只是给出一些背景:

我正在特别考虑我们拥有的 ServiceLocator 实现,它将 UnityContainer 保存在静态类变量中。问题是,在 ServiceLocator 上注册一个容器的多个应用程序会相互干扰吗?

这些应用程序在 .NET 4.0 上的 IIS 7.5 中运行,如果这有什么不同的话。

示例代码(简化)

public static class ServiceLocator
    {
        private static IUnityContainer _container;

        public static void Initialize(IUnityContainer container)
        {
            if (_container != null)
            {
                throw new ApplicationException("Initialize should only be called once!");
            }
            _container = container;
        }

    }

如果我从在同一个应用程序池中运行的两个不同的 Web 应用程序运行它,通常在 Application_Start 中,它会在第二次调用时抛出异常吗?它总是会抛出异常吗?它永远不会抛出异常吗?它会在某些配置中引发异常吗?

更新:我知道每个应用程序域都会有一个静态变量实例。因此,问题可以改写为“如果在同一个应用程序池中运行多个 ASP.NET 应用程序,我将拥有多少个应用程序域?”

我一直在寻找很多,但还没有找到任何权威的参考资料。任何帮助表示赞赏,最好参考微软官方文档。

4

3 回答 3

17

如果在同一个应用程序池中运行多个 ASP.NET 应用程序,我将拥有多少个应用程序域?

每个应用程序池可以有多个工作进程,每个工作进程将运行不同的应用程序实例。应用程序的每个实例都有一个单独的AppDomain- 因此您最初问题的答案是每个应用程序实例一个。

于 2013-06-30T12:59:48.023 回答
1

我知道每个静态变量都存在于应用程序域的生命周期中。

因此,基于此,它将存在于每个应用程序池进程中。

于 2013-06-30T12:24:39.323 回答
1

基于每个 AppDomain 将有一个静态变量实例这一事实,并且关于 K. Scott Allen 的这篇(将近 10 年的)文章,每个 ASP.NET 应用程序有一个 AppDomain,我将得出结论,将有每个 ASP.NET Web 应用程序的每个共享变量的一个实例,即使它们都在同一个应用程序池中运行。

如果引入更多工作进程,我怀疑这是每个应用程序运行的每个进程的一个实例。

尽管两个应用程序的代码都驻留在同一个进程中,但隔离单元是 .NET AppDomain。如果存在具有共享或静态成员的类,并且这些类存在于两个应用程序中,则每个 AppDomain 都将拥有自己的静态字段副本——数据不共享。

http://odetocode.com/Articles/305.aspx,参见“AppDomains 和你”部分)。

所以,我最初的问题的答案是 3),如果运行一个工作进程。

于 2013-06-30T13:01:30.200 回答