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

时间:2013-06-30 12:13:26

标签: c# asp.net .net

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

  1. 每个应用程序池一个?
  2. 每个应用程序池工作进程一个?
  3. 每个申请一个?
  4. 别的什么?
  5. 只是给出一些背景信息:

    我正在考虑一个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官方文档。

3 个答案:

答案 0 :(得分:15)

  

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

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

答案 1 :(得分:1)

我知道每个静态变量都适用于App Domain的生命周期。

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

答案 2 :(得分:1)

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

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

  

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

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

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