Статический объект / переменная хранится в кэше / сеансе в веб-приложении на .NET? - PullRequest
2 голосов
/ 12 июля 2011

Недавно у меня возникли проблемы.

В WebForm я объявляю статический объект, например:

public static MyObject myobject=new MyObject();
Response.Write(myobject.Title());

сейчас, если я загружаю другую страницу, которая не содержит объявление myobject, и я делаю снова

Response.Write(myobject.Title());

Я вижу предыдущий результат. Сохраняется ли объект в сеансе во время навигации из-за статичности? И это считается VIEWSTATE? Или что происходит?

Ответы [ 4 ]

4 голосов
/ 12 июля 2011

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

Короче, старайтесь не использовать статические переменные в этой ситуации.

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

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

2 голосов
/ 12 июля 2011

Это просто статическая переменная.Он «живет» рядом с типом - поэтому он будет использоваться всеми кодами, обращающимися к одному и тому же полю через один и тот же тип в том же AppDomain.Он будет потерян при AppDomain перезапуске и не будет распределен между несколькими серверами и т. Д.

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

2 голосов
/ 12 июля 2011

Статические объекты распределяются между пользователями.Он не сохраняется в сеансе, уникальном для пользователя или состояния просмотра, уникального для каждой страницы.

Прочтите Рекомендации по управлению состоянием ASP .NET , чтобы узнать, какой тип управления состояниемособенность, которую следует использовать для какого сценария.

1 голос
/ 12 июля 2011

Если это поможет, я склоняюсь к тому, что вы можете объявить два отдельных объекта в одном классе - определение динамического объекта и статический объект. Обычно, если вы создаете их в одном и том же определении класса, между ними есть связь, и они работают в тандеме (простой пример патента).

Это означает, что объект создается на основе динамического объекта. Все еще существует статический объект, не затронутый созданием динамического объекта (объектов). Поскольку это может сбивать с толку, вам не следует объединять их, не проявляя осторожности и не понимая различия между ними.

Я понимаю, что это не настоящее понимание того, что происходит, но оно помогает мне держать в голове это различие. Каждый тип имеет свое собственное использование и должен использоваться соответствующим образом (я видел динамические классы, которые должны были быть статическими, а также наоборот).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...