private void Page_Load(object sender, System.EventArgs e)
{
if(PersonalStorage.var1 != null)
{
Label1.Text = PersonalStorage.var1;
}
}
private void Button1_Click(object sender, System.EventArgs e)
{
PersonalStorage.var1 = Session.SessionID;
}
Проблема с длительными сессиями
Проблема в том что несмотря на выставленный таймаут(sessionState.timeout) в 200 минут данные сессии теряются после 40-50 минуты. Можно ли их как-то хранить более надежно?
Сессию чего?
Если создать вот такую переменную в сессии:
Session("LastName") = "LastName"
то через некоторое время(>40мин) она обнуляется. Как этого избежать?
Session("LastName") = "LastName"
то через некоторое время(>40мин) она обнуляется. Как этого избежать?[/quote]
Она обнуляется скорее всего из-за сборки мусора, т.к. скорее всего на переменную сессии (а не саму сессию!!!) LastName нет активных ссылок. Самый простой вариант, создать переменную, которая будет жить в течении всей сессии - а это только статические переменные и назначит ей значение LastName.
Идея хорошая, но как это будет работать с несколькими одновременными сессиями? Я имею ввиду, что если я создам какой-то класс со статическими членами и буду хранить в этих членах нужные мне значения, то эти значения будут общими для всех сессий.
Может быть можно как-то перенастроить параметры сборки мусора?
Может быть можно как-то перенастроить параметры сборки мусора?[/quote]
Для каждого удалённого пользователя создаётся отдельный домен приложения (AppDomain) и в него загружается код. Так что теоретически даже статическая переменная для каждого пользователя будет своя. Проверить это можно практически и много времени не займёт.
Проверил. Не работает. Код действительно элементарный:
Код:
Эта штука была запущена в трех разных браузерах(IE, Opera, FF). После клика на кнопку в одном браузере SessionID заносится в статическую переменную.
Если обновляю(не сабмичу) другие два браузера, то вижу значение этого SessionID. Получается, что статическая переменная общая. :(
Проблема до сих пор осталась нерешенной. Я попытаюсь сформулировать по другому варианты ее решения.
1) Можно ли создать статический объект в С# который будет уникален для каждого домена приложения?
2) Можно ли так настроить работу сессии и/или сборщика мусора, чтобы сессионные переменные не подвергались чистке во время работы приложения?
У кого-нибудь есть какие-то мысли как это можно реализовать?
А если создать класс, у которого статическое свойство будет, например, типа HashTable, в котором ключом будет являться идентификатор сессии, а значением как раз эта переменная.
Это то что нужно. Спасибо.
Можно попробовать создать instance-поле в классе, который инкапсулирует все контролы (вроде бы производный от Page).