Yvision.kz
kk
Разное
Разное
399 773 постов42 подписчика
Всяко-разно
-4
01:49, 11 апреля 2011

Глобальная переменная в HttpApplication | .NET

Допустим, такой класс веб-приложения (наследованный от 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 при первом запросе?

Чего я не понимаю?

-4
479
1