|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
14. Управление состояниемУправление состоянием в приложениях ASP.NET 2.0, куки, ViewState, query string (строка запроса), Session ID и режим cookieless По умолчанию при работе с ASP.NET информация состояния, как в любом Web-приложении, не сохраняется. Это значит, например, что, если не принять специальных мер, то информация о том, что ввел/выбрал пользователь на одной странице при переходе на другую будет потеряна. Однако часто в реальных приложениях нам надо сохранять информацию сеанса (например, под каким именем пользователь зарегистрировался, что он выбрал на начальной странице и т.п.) в ходе всего сеанса. В ASP.NET поддерживается два типа управления информацией о состоянии: серверный тип и клиентский тип. Серверный тип обеспечивает максимальную защищенность, но при этом расходует дополнительные ресурсы сервера. Клиентский тип менее ресурсоемок с точки зрения серверных ресурсов, однако его защищенность намного ниже. При использовании серверного типа в вашем распоряжении: · application state (информация приложения, общая для всех пользователей, например, информация о количестве посетителей Web-сайта); · session state (информация конкретного пользователя, доступная только в его сеансе. Например, информация о выбранной им цветовой схеме); · database state server - если информации состояния много, ее можно сохранять в базе (на SQL Server или другой). Этот способ можно использовать вместе с session state или cookies. · объект Cache - еще одна возможность работать с информацией состояния на уровне приложения. При использовании клиентского типа вам доступны: · куки - маленькие текстовые файлы, которые создаются на компьютере пользователя для хранения информации состояния; · свойство ViewState - встроенная структура, которая обеспечивает хранение значений при повторном обращении к странице. Физически представляет собой скрытое поле в странице; · query strings - информация состояния постепенно накапливается в строке запроса и передается при запросе каждой новой страницы, например: http://www.contoso.com/listwidgets.aspx?category=basic&price=100 В этом курсе из клиентских технологий будут рассмотрены только куки. Работа с application state обеспечивается классом HttpApplicationState, который автоматически создается для каждого активного приложения ASP.NET. Сам по себе этот объект - всего лишь коллекция пар имя ключа/значение. У него множество свойств и методов, которые почему-то не подсказываются (можно получить информацию только через документацию). Фактически это - глобальная структура хранения, которая доступна со всех страниц Web-приложения. В эту структуру можно добавлять значения ключ/значение ан уровне всего приложения, а затем извлекать их. Обычно используется для хранения данных, общих для всех сеансов, которые меняются не часто. Информация session state хранится при помощи объекта HttpSessionState. Этот объект автоматически создается для каждого активного сеанса Web-приложения. По существу это - такой же набор ключей/значений, однако по сравнению с HttpApplicationState для этого объекта предусмотрено множество специфических свойств, при помощи которых можно получить информацию о сеансе или настроить его свойства. При желании информацию HttpSessionState можно сохранять в базе данных или на state server. Набор комбинаций ключ/сеанс, который используется в этих объектах, называется hashtable (структура, очень похожая на словарь). Каждый активный сеанс Web-приложения идентифицируется и отслеживается по уникальному 120-битному Session ID, который состоит исключительно из символов ASCII, разрешенных в URL. Далее Session ID используется в куки или прописывается прямо в строку запроса URI (такой подход называется Cookieless Session ID) и по нему и идентифицируется сеанс пользователя. Серверная работа с состоянием требует обязательной передачи Session ID при помощи куки на клиентском компьютере. Для долговременного хранения информации сеанса (например, данных. которые пользователь ввел при регистрации) удобнее всего эту информацию сохранять на источнике. В большинстве Web-приложений для работы с состоянием используются куки. Куки - это небольшой набор данных, который хранится или в текстовом файле на клиентском компьютере, или просто в оперативной памяти там же. Куки используются для хранения информации о конкршетном клиенте, сеансе или приложении. При обращении клиента на Web-сервер броузер посылает информацию куки вместе с запросом. Для каждого куки определяется домен, к которому этот куки предназначен. Для одного домена может быть использовано одновременно несколько куки. Куки бывают двух видов: · временные - живут только до закрытия окна броузера; · постоянные - сохраняются на жестком диске компьютера и могут жить месяцами и годами (как им назначено). Internet Explorer сохраняет их в виде файлов с именами username@domainname.txt. Пользователь всегда может почистить куки на своем компьютере, так что такую возможность следует иметь в виду. Куки - не очень безопасное решение (особенно по сравнению с применением HttpSessionState). пользователь легко может изменить значения куки на своем компьютере. В каждом куки может храниться не более 4 Кбайт информации. Теперь - о работе с файлом global.asax, который используется для обработки событий уровня приложений. Он автоматически создается на уровне Web-приложения и в нем присутствуют заранее готовые событийные процедуры на различные события в работе приложения (Application_Start, Session_Start, Application_BeginRequest, Session_End и т.п.) Для того, чтобы использовать общую информацию на страницах Web-приложения, используются переменные уровня приложения и сеанса. Переменные уровня приложения и сеанса инициализируются в событийных процедурах типа Start в global.asax. Для хранения информации уровня приложения используется объект Application, а уровня сеанса - Session. Хранение, как уже говорилось, производится в парах ключ/значение, и может выглядеть так (для сеанса): Sub Session_Start(ByVal Sender As Object, _ ByVal e As EventArgs) Session("BackColor") = "beige" Session("ForeColor") = "black" End Sub и так (для приложения): Sub Application_Start(ByVal Sender As Object, _ ByVal e As EventArgs) Application("NumberofVisitors") = 0 End Sub В ходе работы Web-приложения вы без проблем можете менять значения переменных уровня сеанса и приложения, например так: Session("BackColor") = "blue" Если с приложением может работать несколько пользователей, лучше обезопасить себя от проблем при одновременном изменении одних и тех же данных: Application.Lock() Application("NumberOfVisitors") += 1 Application.UnLock() Считать записанную информацию можно также без всяких проблем: strBgColor = Session("BackColor") lblNbVisitor.Text = Application("NumberOfVisitors") HTTP - это протокол без сохранения состояния, поэтому Web-сервер не может определить, что сейчас происходит на компьютере пользователя: то ли пользователь читает Web-страницу, то ли уже давно закрыл окно броузера и занят своими делами. Поэтому обычно после какого-то времени отсутствия активности пользователя его сеанс закрывается по тайм-ауту. В ASP.NET по умолчанию такой тайм-аут составляет 20 минут. Если пользователей может быть много, то для сохранения серверных ресурсов это время сокращают, если пользователям нужно заполнять сложные формы - время можно и увеличить. Настройка тайм-аута для сеанса производится в файле web.config. Соответствующая часть выглядит так: <configuration> <system.web> <sessionState timeout="10" /> </system.web> </configuration> После того, как все сеансы пользователей завершены, Web-приложение немедленно выгружается из памяти и срабатывает событие Application_End. По умолчанию информация состояния всех сеансов хранится in process - то есть в памяти, которая относится к процессу данного Web-приложения. Главная проблема при этом - в большом расходе памяти на сервере, если с ним одновременно работает большое количество пользователей. Поэтому в ASP.NET есть возможность хранить информацию состояния сеансов out of process: 1) в базе данных SQL Server; 2) на специальном State Server (это может быть компьютер под управлением Windows 2000 Server и выше). В этом случае информация сеансов пользователей просто складывается в его оперативную память. Главное преимущество таких решений - масштабируемость и возможность использования Web farms. Как сохранять информацию состояний сеансов out of process; 1) настроить SQL Server или state server. Для настройки SQL Server достаточно прогнать при помощи OSQL специальный скрипт: c:\> OSQL .S SQLServerName -E <InstallSqlState.sql Этот скрипт создает базу данных ASPState со всем, что необходимо. Для настройки State Server достатчоно на нем запустить службу ASP.NET. 2) объяснить Web-приложению, где оно должно хранить информацию состояния сеансов. Это делается через тот же файл web.config: <sessionState mode="SQLServer" sqlConnectionString="data source=SQLServerName; Integrated security=true" /> Если используется State Server, нужно вместо имени SQL Server просто указать имя компьютера, на котором работает служба ASP.NET. Теперь - про куки и Session ID. Куки как часть заголовка протокола HTTP передаются на сервер с каждым клиентским запросом (или обратно с ответом сервера). Они позволяют хранить информацию не только на уровне текущего сеанса, но и между сеансами. Куки создаются при помощи свойства Cookies объекта Response и класса Request. Свойство Cookies представляет коллекцию Cookies (экземпляр класса HttpCookieCollection). Создать новый куки с именем MyCookie можно так: Dim objCookie As New HttpCookie("myCookie") Dim now As DateTime = DateTime.Now Добавить пары ключ/значение можно так: objCookie.Values.Add("Time", now.ToString()) objCookie.Values.Add("ForeColor", "White") objCookie.Values.Add("BackColor", "Blue") Назначить время жизни Cookie - так: objCookie.Expires = now.AddHours(1) Если время жизни куки не указано, то это будет временный куки и он будет жить только пока открыто окно броузера у клиента. Чтобы этот куки со всеми настроенными параметрами был передан на компьютер пользователя, его надо добавить к объекту Response: Response.Cookies.Add(objCookie) Если мы таким образом создали куки с именем пользователя и передали его в броузер пользователю, то выглядеть соответствующая часть заголовка HTTP будет так: Set-Cookie: Username=John+Chen; path=/; domain=microsoft.com; Expires=Tuesday, 01-Feb-05 00.00.01 GMT Атрибут Domain генерируется автоматически броузером пользователя. Куки будет передаваться только на тот Web-сайт, который совпадает с указанным доменом. При обращении на сайт microsoft.com в заголовке HTTP-запроса клиента будет стоять Cookie: Username: John+Chen Сами куки хранятся в каталоге \Documents and Settings\Username\Cookies, а имя файла куки выглядит как Username@DomainName.txt. Чтобы программно получить информацию о значении куки, нужно обратиться к коллекции Cookies объекта Request: Dim objCookie As HttpCookie = Request.Cookies("myCookie") А затем извлекать из него нужные значения: lblTime.Text = objCookie.Values("Time") lblTime.ForeColor = System.Drawing.Color.FromName _ (objCookie.Values("ForeColor")) lblTime.BackColor = System.Drawing.Color.FromName _ (objCookie.Values("BackColor")) Есть возможность обойтись и без куки. Для каждого сеанса ASP.NET генерирует уникальный идентификатор - SessionID, который вполне можно использовать для идентификации сеанса. Его применение позволяет решить различные проблемы в ситуациях, когда работа с куки отключена в броузере пользователя. Сохранение состояния сеанса средствами SessionID называется cookieless session. Включается работа с cookieless в файле web.config. В нем нужно найти раздел sessionState и поменять значение в нем на true (по умолчанию false). <sessionState cookieless="true" /> После этого любой запрос к странице Web-приложения будет переделываться на что-то вида http://server/(h44a1e55c0breu552yrecobl)/page.aspx Однако при этом нужно помнить: · при использовании cookieless session в проекте нельзя использовать абсолютные ссылки - только относительные; · в большинстве броузеров максимальная длина URL - 255 символов.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
Получить учебные материалы по этому курсу |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||