Подтвердить что ты не робот

Пожизненная статическая переменная ASP.NET

Я храню некоторую информацию в статических переменных, определенных в классе страницы (не в Global.asax). Я только объявляю переменную в коде, например:

protected static int SomeGlobalUnsecureID;
protected static string SomeGlobalUnsecureString;

и определить переменную в событии PageLoad. Например, я проверяю идентификатор из базы данных, если он отличается от SomeGlobalUnsecureID, я обновляю SomeGlobalUnsecureID и String из другого места, в противном случае оставляю их как есть. Это совершенно безопасно в моем приложении. логика (т.е. эти данные небезопасны, каждый может получить к ним доступ, без проблем); Единственное, что я хочу сделать, - это

  • Удерживайте одинаковый объем памяти независимо от подключенного пользователя.

  • Изменить, если и только если постоянная информация отличается от постоянной в 'memory' (потому что фактически чтение строки занимает много времени для я.

Теперь, поскольку я делаю проверку в PageLoad, у меня нет проблем с перезагруженными страницами. Однако моя страница заполнена WebMethods, и иногда я вижу, что статические переменные обнуляются. И странная часть; сеанс все еще активен, даже когда статические переменные обнуляются (so- > нет перезапуска сервера или приложения пула и т.д.)

Это действительно странно для меня. Я предполагаю, что статическая переменная будет содержать свое значение до тех пор, пока приложение (каким-то образом) не закончится. Но даже сеанс не закончился, статическая переменная обнуляется. Что ты предлагаешь? Использует ли переменные приложения лучший выбор? Все документы, которые я читал в Интернете, предлагают статические переменные вместо переменных приложения, нужно ли их объявлять как-то иначе?

4b9b3361

Ответ 1

Статические переменные сохраняются для жизни домена приложения. Таким образом, две вещи, которые заставят ваши статические переменные "reset" - перезапуск домена приложения или использование нового класса. В вашем случае со статическими переменными, хранящимися в классе страниц aspx, вы можете потерять статические переменные, когда ASP.NET решает перекомпилировать страницу aspx в новый класс, заменив старый класс страницы на новый.

По тем причинам, если система решает перезапустить или заменить класс (.NET не убивает или не выгружает классы/сборки в работающем домене приложения тогда ваши статические переменные будут reset, потому что вы получаете новый класс с перезагрузкой или заменой. Это относится как к aspx Pages, так и к посмотреть динамическую компиляцию ASP.NET.

Вы не можете предотвратить потерю статических переменных из перезапуска домена приложения, но вы можете попытаться избежать его из замены класса. Вы можете поместить свои статические переменные в класс, который не является страницей aspx и не находится в каталоге App_Code. Возможно, вы захотите разместить их на static class где-нибудь в вашей программе.

public static class GlobalVariables
{
    public static int SomeGlobalUnsecureID;
    public  static string SomeGlobalUnsecureString;
}

Статические переменные для каждого пула, это означает, что если у вас есть 2 пула, которые запускают ваш сайт asp.net, у вас есть две разные статические переменные. (Режим веб-сада)

Статические переменные теряются, если система перезапускает приложение asp.net одним из этих способов.

  • пул решает, что нужно выполнить перекомпиляцию.
  • Вы открываете файл app_offline.htm
  • Вы вручную перезапустите пул.
  • Пул достигает определенных пределов, которые вы определили и выполните перезапуск.
  • По какой-либо причине вы перезапускаете iis или пул.

Эти статические переменные не являются потокобезопасными, и вам нужно использовать ключевое слово блокировка, особенно если вы обращаетесь к ним из разных потоков.

Поскольку перезапуск приложения будет reset вашей статикой независимо от того, что, если вы действительно хотите сохранить свои данные, вы должны хранить данные в базе данных с помощью пользовательских классов. Вы можете хранить информацию для каждого пользователя в Состояние сеанса с помощью режима состояния базы данных . Состояние приложения/переменные ASP.NET не поможет вам, потому что они хранятся в памяти, а не в базе данных, поэтому они также теряются при перезагрузке домена приложения.

Ответ 2

Я думаю, что следующие два момента важны для времени жизни статических переменных:

1 - В расширенных настройках пула приложений установите флажок "Переработка" → "Регулярный интервал времени (минуты)". Значение по умолчанию - 1740, что означает, что каждые 29 часов ваши статические переменные теряются из-за утилизации пула приложений. Этот параметр используется для прекращения возможных утечек памяти. Я бы не изменил эту настройку.

2 - В дополнительных настройках пула приложений установите флажок "Модель процесса" → "Тайм-аут ожидания (минуты)". Значение по умолчанию - 20, что означает, что за каждые 20 минут бездействия в пуле приложений рабочие процессы прекращаются/приостанавливаются, что приведет к потере ваших статических переменных. Этот параметр используется для освобождения ресурсов, когда пул приложений не используется в течение некоторого времени. Вы можете установить его на 0, чтобы отключить таймаут.

Ответ 3

Статическая переменная используется для хранения всего объекта для одного значения

protected void Page_Load(object sender, EventArgs e)
{
    sss s1, s2;
    s1 = new sss();
    s1.TotalMark = 10;
    s2 = new sss();
    s2.TotalMark = 20;
    sss.SchoolName = "St.Joseph Hr.Sec.S"; //We can access through class and assign common to all
    s1.PrintData();
    s2.PrintData();
}

public class sss
{
    public static string SchoolName { set; get; }
    public int TotalMark { set; get; }
    public string StudentName{set;get;}
    public void PrintData()
    {
        Console.WriteLine(TotalMark);
        Console.WriteLine(SchoolName);
        Console.WriteLine(StudentName);
    }
}