Обработка сеансовых данных
Обработка сеансовых данных
Поговорив о данных уровня приложения, давайте перейдем к обсуждению данных, создаваемых на уровне пользователя. Как уже упоминалось, сеанс на самом деде представляет собой процесс взаимодействие пользователя с Web-приложением, представленный типом HttpSessionState. Для поддержки информации сеанса конкретного пользователя объект HttpApplication и любые другие типы System.Web.UI.Page могут использовать доступ к свойству Session. Классическим примером необходимости поддержки пользовательских данных является корзина покупателя: при подключении десятков посетителей к странице Интернет-магазина для каждого посетителя должен поддерживаться уникальный список товаров, которые этот посетитель собрался купить.
При регистрации нового пользователя в Web-приложении среда выполнения .NET автоматически назначит пользователю уникальный идентификатор сеанса, используемый для идентификации данного пользователя. С каждым идентификатором сеанса ассоциируется пользовательский экземпляр типа HttpSessionState, который будет содержать данные соответствующего пользователя. Технология добавления и чтения сеансовых данных синтаксически идентична работе c данными приложения, например:
// Добавление/чтение сеансовой переменной для данного пользователя.
Session["DesiredCarColor"] = "зеленый";
String color = (string)Session["DesiredCarColor"];
Производный от HttpApplication тип позволяет выполнить перехват событий начала и завершения сеанса с помощью обработчиков событий Session_Start() и Session_End(). В пределах Session_Start() вы можете создать любые элементы данных пользователя, а в Session_End() можно выполнить любые действия, необходимые при завершения сеанса пользователя.
‹%@ Application Language="C#" %›
‹script runat="server"›
…
void Session_Start(objecl sender, EventArgs e) {}
void Session_End(object sender, EventArgs e) {}
‹/script›
Подобно типу HttpApplicationState, тип HttpSessionState может содержать любой тип, производный от System.Object, включая пользовательские классы. Предположим, например, что у нас есть новое Web-приложение (SessionState), которое определяет вспомогательный класс с именем UserShoppingCart.
public class UserShoppingCart {
public string desiredCar;
public string desiredCarColor;
public float downPayment;
public bool isLessing;
public DateTime dateOfPickUp;
public override string ToString() {
return string.Format("Машина: {0}‹br›Цвет: {1}‹br›$ кредит: {2}‹br›" +
"Аренда: {3}‹br›Доставка: {4}",
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.