问题 ASP.NET站点中静态变量的范围


如果在同一个应用程序池中运行多个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应用程序,我将拥有多少个应用程序域?”

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


5569
2018-06-30 12:13


起源



答案:


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

每个应用程序池可以有多个工作进程,每个工作进程将运行不同的应用程序实例。每  一个应用程序有一个单独的 AppDomain  - 所以原始问题的答案是每个申请一个


14
2018-06-30 12:59



你只是打败了我,毕竟你编辑了最后三分钟,你的答案是正确的,所以我会给你信用;)实际上,每个工人的过程是一个应用程序,不是吗?如果一个应用程序在多个工作进程中运行? - Erik A. Brandstadmoen
@ ErikA.Brandstadmoen不是它仍然是每个实例,如果一个应用程序有多个工作线程,那么它们应该仍然共享相同的 AppDomain。 - James
多个工作进程(Web Garden),而不是多个工作线程。并且,是的,每个实例一个仍然是正确的,因为每个进程都有一个应用程序实例。因此,“每个应用程序实例一个”是精确的,并且每个工作进程有一个应用程序实例,对吗? - Erik A. Brandstadmoen
@ ErikA.Brandstadmoen您之前的评论指的是 线程不是 流程  - 2件不同的东西。我已经在答案中说过每一个 处理 托管不同的应用 实例。是的,每个进程只有一个实例。为清楚起见,我已更新了我的答案。 - James
在我编辑它以引用进程之前,注释是指线程,是的。现在它指的是过程;)无论如何,我认为你现在的答案是明确和正确的。只是为了跟随我们的人...谢谢。 - Erik A. Brandstadmoen


答案:


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

每个应用程序池可以有多个工作进程,每个工作进程将运行不同的应用程序实例。每  一个应用程序有一个单独的 AppDomain  - 所以原始问题的答案是每个申请一个


14
2018-06-30 12:59



你只是打败了我,毕竟你编辑了最后三分钟,你的答案是正确的,所以我会给你信用;)实际上,每个工人的过程是一个应用程序,不是吗?如果一个应用程序在多个工作进程中运行? - Erik A. Brandstadmoen
@ ErikA.Brandstadmoen不是它仍然是每个实例,如果一个应用程序有多个工作线程,那么它们应该仍然共享相同的 AppDomain。 - James
多个工作进程(Web Garden),而不是多个工作线程。并且,是的,每个实例一个仍然是正确的,因为每个进程都有一个应用程序实例。因此,“每个应用程序实例一个”是精确的,并且每个工作进程有一个应用程序实例,对吗? - Erik A. Brandstadmoen
@ ErikA.Brandstadmoen您之前的评论指的是 线程不是 流程  - 2件不同的东西。我已经在答案中说过每一个 处理 托管不同的应用 实例。是的,每个进程只有一个实例。为清楚起见,我已更新了我的答案。 - James
在我编辑它以引用进程之前,注释是指线程,是的。现在它指的是过程;)无论如何,我认为你现在的答案是明确和正确的。只是为了跟随我们的人...谢谢。 - Erik A. Brandstadmoen


我知道每个静态变量都存在于App Domain的生命周期中。

因此,基于此,它将按应用程序池进程生效。


1
2018-06-30 12:24



那么,为了跟进,在一个应用程序池中运行十个应用程序时,我将拥有多少个应用程序域?请使用上面的替代1-4指定,请参考。 - Erik A. Brandstadmoen
你也反驳自己。在第一句话中,你说我将每个AppDomain有一个,在第二个,你说我将每个进程有一个。每个perocess肯定会有多个AppDomain。 - Erik A. Brandstadmoen
我似乎误读了您的问题:但要保持一致:每个App Domain都有一个静态变量实例,如果您的应用程序在多个应用程序域中运行,它将有多个实例。这是一个很好的阅读, msdn.microsoft.com/en-us/magazine/cc163791.aspx#S14 - Tamim Al Manaseer


基于每个AppDomain将有一个静态变量实例的事实,以及K. Scott Allen撰写的这篇(差不多10年历史)的文章,每个ASP.NET应用程序都有一个AppDomain,我将得出结论,将会有每个ASP.NET Web应用程序的每个共享变量的一个实例,即使它们都在同一个应用程序池中运行。

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

即使两个应用程序的代码都驻留在内部   同样的过程,隔离的单位是.NET AppDomain。如果有   是具有共享或静态成员的类,并且这些类存在于   这两个应用程序,每个AppDomain都有自己的副本   静态字段 - 不共享数据。

http://odetocode.com/Articles/305.aspx,请参阅“AppDomains和您”部分。

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


1
2018-06-30 13:01