«продолжительность жизни» .NET статических переменных? - PullRequest
2 голосов
/ 10 марта 2011

Я провел небольшой эксперимент . На событии LoginButton_Click () от кнопки Login.aspx у меня есть код, который выполняет что-то вроде:

MyClass.MyPublicStaticString = LoginNameTextBox.Text;

После входа в систему он переходит к Default.aspx с помощью FormsAuthentication. На Default.aspx у меня есть код на Page_Load () , например:

Label1.Text = MyClass.MyPublicStaticString.ToString();

После ожидания в течение нескольких минут Label1.Text становится пустым даже за до того, как истечет мое время ожидания входа в систему.

Что здесь происходит?

Ответы [ 6 ]

15 голосов
/ 10 марта 2011

Статические поля имеют (если не [ThreadStatic]) один экземпляр на домен приложения, что означает: все запросы имеют одинаковое значение . Вы должны быть исключительно осторожно, используя static в веб-приложении. В случае сомнений: нет.

Re жизни; домен приложения; они не будут собраны при назначении статическому полю и истекут, если пул приложений перезапустится в IIS.

3 голосов
/ 22 марта 2012

Можно использовать объект Application State.Однако он содержит информацию, которая будет сохраняться до тех пор, пока приложение работает.Состояние сеанса, с другой стороны, имеет время жизни, которое привязано к посещению текущего пользователя, плюс значение по умолчанию 20 минут после этого, чтобы убедиться, что он / она не просто временно перекусывает и использует медленную сеть.Кроме того, ApplicationState видим / доступен для всех пользовательских контекстов;в то время как сессия видна и доступна только в контексте текущего пользователя.С третьей стороны, обратные передачи ограничены в контексте контекстом последней страницы, отправленной с сервера, поскольку обратная передача происходит, когда браузер возвращает страницу на сервер, включая результаты действий пользователя.Стиль жизни Страницы отличается от жизненного цикла Сессии и ApplicationState, и его не следует путать ни с кем другим.

2 голосов
/ 10 марта 2011

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

Самое лучшее, что это связано с другим запросом, каким-то образом сбрасывающим переменную, или, возможно, даже перезапуском всего приложения, создавая новое пространство памяти и, очевидно, без предыдущего статического значения.

1 голос
/ 10 марта 2011

Вы действительно должны использовать Состояние сеанса для такого рода вещей.
Если вы этого не сделаете, два пользователя, вошедшие в систему в течение короткого периода времени , получат имя последнего пользователя , поскольку оно было сохранено последним в MyPublicStaticString.

0 голосов
/ 10 марта 2011

Возможно ли использовать объект ASP.NET Application State вместо этого, как в ASP.NET, это также будет поддерживать состояние для нескольких Postbacks / Sessions?

0 голосов
/ 10 марта 2011

Я думаю, что класс страницы вашего приложения больше не находится в памяти на вашем веб-сервере, поэтому ваша статическая переменная отклоняется, но ваш файл cookie аутентификации все еще действителен, так как время ожидания аутентификации форм asp.net еще не истекло.

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