desiredCar, desiredCarColor, downPayment, isLeasing,
dateOfPickUp.ToShortDateString());
}
}
В обработчике событий Session_Start() можно назначить каждому пользователю свой экземпляр класса UserShoppingCart.
void Session_Start(Object sender, EventArgs e) {
Session["UserShoppingCartInfo"] = new UserShoppingCart();
}
При просмотре ваших Web-страниц пользователем вы можете взять экземпляр UserShoppingCart и заполнить его поля данными соответствующего пользователя. Предположим, что у вас есть простая страница *.aspx с набором элементов ввода, соответствующих каждому полю типа UserShoppingCart, и кнопкой (Button), используемой для установки введенных значений (рис. 24.5).
Рис. 24.5. Графический интерфейс пользователя для приложения с сеансовыми данными
Серверный обработчик события Click действует весьма прямолинейно (считывает значения элементов TextBox и отображает поступающие значения в поле типа Label).
protected void btnSubmit_Click(object sender, EventArgs e) {
// Установка преференций текущего пользователя.
UserShoppingCart u = (UserShoppingCart)Session["UserShoppingCartInfo"];
u.DateOfPickUp = myCalendar.SelectedDate;
u.desiredCar = txtCarMake.Text;
u.desiredCarColor = txtCarColor.Text;
u.downPayment = float.Parse(txtDownPayment.Text);
u.isLeasing = chkisLeasing.Checked;
lblUserInfo.Text = u.ToString();
Session["UserShoppingCartInfo"] = u;
}
В Session_End() вы можете, например, сохранить значения полей UserShoppingCart в базе данных или выполнить какие-то иные действия. Так или иначе, если Вы запустите два или три экземпляра своего браузера, вы должны увидеть, что каждый пользователь может создать свою корзину покупателя, связанную с его уникальным экземпляром HttpSessionState.
Дополнительные члены HttpSessionState
Кроме индексатора типа, класс HttpSessionState определяет ряд других интересных членов. Во-первых, свойство SessionID возвращает уникальный идентификатор текущего пользователя.
lblUserID.Text = string.Format("Значение вашего ID: {0}", Session.SessionID);
Методы Remove() и RemoveAll() можно использовать для удаления элементов из экземпляра HttpSessionState пользователя.
Session.Remove["НекоторыеУжеНенужныеЭлементы"];
Тип HttpSessionState определяет также набор членов, управляющих значениями времени ожидания для текущего сеанса. Снова подчеркнем, что по умолчанию каждому пользователю позволяется 20 минут бездействия до того, как объект HttpSessinState будет уничтожен. Поэтому если пользователь войдет в ваше Web-приложение (и получит в результате этого свое уникальное значение идентификатора сеанса), но не будет обращаться к узлу в течение 20 минут, среда выполнения "решит", что пользователь больше не интересуется узлом и уничтожает все сеансовые данные этого пользователя. Вы имеете возможность изменить это принятое по умолчанию 20-минутное значение для каждого пользователя в отдельности, используя свойство Timeout. Чаще всего для такого изменения используется контекст метода Global.Session_Start().
protected void Session_Start(Object sender, EventArgs e) {
// Пользователю разрешается 5 минут бездействия.
Session.Timeout = 5;
Session["UserShoppingCartInfo"] = new UserShoppingCart();
}
Замечание.Чтобы не менять значение Timeout каждого пользователя, вы можете изменить принятое по умолчанию 20-минутное значение для всех пользователей сразу с помощью атрибута Timeout элемента ‹sessionState› в файле Web.config (структура и возможности этого файла будут рассмотрены в конце главы).
Преимущество использования свойства Timeout заключается в том, что вы можете назначить свои значения времени ожидания для каждого пользователя в отдельности. Например, представьте себе, что ваше Web-приложение позволяет пользователям заплатить за некоторый уровень членства. Вы можете потребовать, чтобы "золотым" членам устанавливалось время ожидания, равное одному часу, а "деревянным" – только 30 секунд. Такая возможность порождает следующий вопрос: как реализовать запоминание соответствующей информации пользователя (например, текущий уровень его членства) между обращениями к Web-странице? Одной из возможностей является использование типа HttpCookie.
Исходный код,Файлы примера SessionState размещены в подкаталоге, соответствующем главе 24.
Последней из рассмотренных здесь технологий управления данными состояния будет использование данных cookie, которые часто имеют вид обычных текстовых файлов (или наборов файлов), сохраняемых на машине пользователя. При регистрации пользователя данного узла браузер проверяет, есть ли на машине пользователя файл cookie для данного URL, и если такой файл обнаруживается, данные файла присоединяются к HTTP-запросу.
Читать дальше