Объем статических переменных на сайтах 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), если выполняется один рабочий процесс.