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中,它会在第二次调用时抛出exception吗? 它会不会抛出exception? 它永远不会抛出exception吗? 它会在某些配置中引发exception吗?

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

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

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

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

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

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

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

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

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

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

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