Допустим, такой класс веб-приложения (наследованный от HttpApplication):
public class MyHttpApplication : HttpApplication{ public string MyGlobalVar = String.Empty; protected void Application_Start()
{
this.MyGlobalVar = "Значение глобальной переменной.";
}
}
Например, в другом участке кода, захочется получить значение глобальной переменной MyGlobalVar такой строкой кода:
string myGlobalVar = ((MyHttpApplication)HttpContext.Current.ApplicationInstance).MyGlobalVar;В этой строке кода понятно, что мы получаем из текущего контекста запроса экземпляр текущего приложения (HttpApplication), преобразовываем его в экземпляр нашего класса (MyHttpApplication) и нам становится доступна глобальная переменная MyGlobalVar, которую мы проинициализировали на старте приложения (в событии Application_Start).
Переменная будет пустая (т.е. пустая строка, String.Empty).
Идем в MSDN и читаем, почему так. "...Во время запуска приложения можно задать только статические данные. Не задавайте каких-либо данных экземпляра, так как они будут доступны только первому созданному экземпляру класса HttpApplication...".
Понятно, что мы облажались. Если хочешь глобально доступных даных, то делай их статическими. А если нужны-таки данные экземпляра HttpApplication, коих, как известно, может создаваться несколько в одном домене (до 100 штук)?
Тогда можно делать это через переопределение функции Init() у класса HttpApplication:
public class MyHttpApplication : HttpApplication{ public string MyGlobalVar = String.Empty; protected override void Init()
{
this.MyGlobalVar = "Значение глобальной переменной.";
}
}
Теперь, при доступе к нашей глобальной переменной из любого участка кода:
string myGlobalVar = ((MyHttpApplication)HttpContext.Current.ApplicationInstance).MyGlobalVar;Она будет иметь значение "Значение глобальной переменной.".
И всё бы хорошо. Но ничего хорошего. Если, я инициализирую глобальные данные экземпляра HttpApplication из события Application_Start, а потом не могу получить эти данные, то это о чем говорит? О том, что первый экземпляр для меня потерян и я работаю уже в другом экземпляре HttpApplication? Если это так, то какого хрена исполняющая среда ASP.NET всегда стабильно создает два экземпляра HttpApplication при первом запросе?
Чего я не понимаю?