关于c#:ASP.NET站点中静态变量的范围

Scope of static variables in ASP.NET sites

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

  • 每个应用程序池一个?
  • 每个应用程序池工作进程一个?
  • 每个应用程序一个?
  • 还有别的吗?
  • 只是为了提供一些背景:

    我特别想一个ServiceLocator实现,它在静态类变量中保存了UnityContainer。问题是,在服务定位器上注册一个容器的多个应用程序会互相干扰吗?

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

    示例代码(简化)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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应用程序(通常在应用程序启动时)运行此程序,它会在第二次调用时引发异常吗?它总是抛出异常吗?它永远不会抛出异常吗?它会在某些配置中引发异常吗?

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

    我一直在四处寻找,但没有找到任何权威的参考资料。如有任何帮助,最好参考微软官方文档。


    If running multiple ASP.NET applications in the same application pool, how many App Domains will I have?

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


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

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

    Even though the code for both of the applications resides inside the
    same process, the unit of isolation is the .NET AppDomain. If there
    are classes with shared or static members, and those classes exist in
    both applications, each AppDomain will have it’s own copy of the
    static fields – the data is not shared.

    (http://odetocode.com/articles/305.aspx,请参阅"AppDomains and You"一节)。

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


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

    基于此,它将按应用程序池进程运行。