Объем статических переменных на сайтах ASP.NET

Если вы используете несколько приложений ASP.NET в одном пуле приложений, сколько экземпляров будет иметь статическую переменную класса?

  • Один на пул приложений?
  • Один на один рабочий процесс пула приложений?
  • Один за приложение?
  • Что-то еще?

Просто чтобы указать некоторый контекст:

Я думаю конкретно о реализации ServiceLocator, которую мы имеем, которая содержит UnityContainer в переменной статического класса. Вопрос в том, вмешиваются ли несколько приложений, регистрирующих контейнер в ServiceLocator?

Приложения работают в IIS 7.5 на .NET 4.0, это должно иметь значение.

Пример кода (упрощенный)

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;
        }

    }

Если я запустил это из двух разных веб-приложений, которые запускаются в одном пуле приложений, обычно в Application_Start, генерирует ли это исключение во втором вызове? Всегда ли это будет исключение? Неужели это никогда не вызовет исключения? Вызывает ли это исключение в некоторых конфигурациях?

UPDATE: Я знаю, что будет один экземпляр статической переменной для домена приложения. Таким образом, вопрос может быть перефразирован на "Если запущено несколько приложений ASP.NET в том же пуле приложений, сколько доменов приложений у меня будет?"

Я много искал, но не нашел никаких авторитетных ссылок на это. Любая помощь приветствуется, желательно со ссылками на официальную документацию Microsoft.

Ответ 1

Если вы используете несколько приложений ASP.NET в одном пуле приложений, сколько доменов приложений у меня будет?

Каждый пул приложений может иметь несколько рабочих процессов, каждый рабочий процесс будет запускать разные экземпляры приложений. Каждый экземпляр приложения имеет отдельный AppDomain - поэтому ответ на ваш исходный вопрос - один для каждого приложения .

Ответ 2

Я знаю, что каждая статическая переменная живет для жизни домена приложения.

Таким образом, на основе этого он будет работать в процессе пула приложений.

Ответ 3

Исходя из того факта, что в AppDomain будет один экземпляр статической переменной, а в отношении этой (почти 10-летней) статьи К. Скотта Аллена есть одно приложение AppDomain для ASP.NET, я завершу, что в каждом ASP.NET-приложении будет один экземпляр каждой общей переменной, хотя все они будут работать в одном пуле приложений.

Если вы вводите больше рабочих процессов, я бы заподозрил, что это один экземпляр для каждого приложения на каждом запущенном процессе.

Несмотря на то, что код для обоих приложений находится внутри тот же процесс, единица изоляции -.NET AppDomain. Если здесь являются классами с общими или статическими членами, и эти классы существуют в оба приложения, каждый AppDomain будет иметь свою собственную копию статические поля - данные не используются.

(http://odetocode.com/Articles/305.aspx, см. раздел "AppDomains and you" ).

Таким образом, ответ на мой первоначальный вопрос будет 3), если выполняется один рабочий процесс.