Общие сведения об управлении состоянием ASP.NET

Visual Studio 2010

Обновлен: Ноябрь 2007

Новый экземпляр класса веб-страницы создается каждый раз при отправлении страницы на сервер. Обычно в традиционном веб-программировании все сведения, связанные со страницей, и элементы управления на странице теряются при каждом цикле обработки. Например, если пользователь ввел сведения в текстовое поле, то эти сведения будут потеряны в ходе цикла обработки от веб-обозревателя или клиентского устройства к серверу.

Чтобы преодолеть это ограничение, свойственное традиционному веб-программированию, в ASP.NET включено несколько параметров, которые помогают сохранить данные как на уровне страниц, так и на уровне приложения. Это следующие свойства:

  • Состояние представления.

  • Состояние элемента управления.

  • Скрытые поля.

  • Файлы cookie.

  • Строки запроса.

  • Состояние приложения.

  • Состояние сеанса.

  • Свойства профиля.

Состояние представления, состояние элемента управления, скрытые поля, объекты cookie и строки запросов включают хранение данных на стороне клиента различными способами. Однако состояние приложения, состояние сеанса и параметры профиля хранят данные в памяти на сервере. Каждый параметр имеет свои преимущества и недостатки, в зависимости от сценария.

В следующих разделах содержится описание параметров для управления состоянием, которые сохраняют сведения либо на странице, либо на клиентском компьютере. При выборе этих параметров между циклами обработки на сервере никакие сведения не сохраняются.

Состояние представления

Свойство ViewState предоставляет объект словаря данных для сохранения значений между несколькими запросами одной страницы. Этот метод используется по умолчанию, чтобы сохранить значения свойств страницы и элементов управления между циклами обработки.

При обработке страницы текущее состояние страницы и элементов управления будут хэшироваться в строку и сохраняться на странице как скрытое поле или как несколько скрытых полей, если объем данных, сохраненных в свойстве ViewState, превышает значение, указанное в свойстве MaxPageStateFieldLength. При отправке страницы обратно на сервер страница анализирует строку состояния представления при инициализации и восстанавливает сведения из свойств на странице.

В состоянии представления возможно также сохранение значений. Дополнительные сведения об использовании параметра «Состояние представления» см. в разделе Общие сведения о состоянии представления ASP.NET. Рекомендации по использованию состояния представления см. в разделе Рекомендации по управлению состоянием ASP.NET.

Состояние элемента управления

Иногда требуется хранить данные состояний элементов управления для их правильной работы. Например, если был написан пользовательский элемент управления, который имеет различные вкладки, отображающие разные сведения, то чтобы этот элемент управления работал так, как ожидается, он должен знать, какая вкладка выбрана между циклами. Для этого можно использовать свойство ViewState, но состояние представления может быть отключено разработчиками на уровне страницы, что станет критичным для этого элемента управления. Чтобы разрешить эту проблему, в структуре страницы ASP.NET предусмотрено средство, называемое состоянием элемента управления.

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

Скрытые поля

ASP.NET позволяет сохранять сведения в элементе управления HiddenField, который отображается в виде стандартного скрытого поля HTML. Скрытое поле не отображается в обозревателе, однако его свойства можно задавать так же, как и свойства стандартных элементов управления. При отправке страницы на сервер содержимое скрытого поля отправляется в коллекцию форм HTTP, как и значения других элементов управления. Скрытое поле служит хранилищем всех специфичных для страницы сведений, которые необходимо сохранить непосредственно на странице.

75x4ha6s.alert_security(ru-ru,VS.100).gifПримечание о безопасности.

Злоумышленники могут легко просмотреть и изменить содержимое скрытого поля. В скрытом поле не следует сохранять сведения, которые являются важными или служат основой правильной работы приложения. Дополнительные сведения см. в разделе Рекомендации по управлению состоянием ASP.NET.

Элемент HiddenField хранит единственную переменную в свойстве Value и должен быть явно добавлен на страницу. Дополнительные сведения см. в разделе Общие сведения о серверном веб-элементе управления HiddenField.

Чтобы значения скрытого поля были доступны в процессе обработки страницы, для отправки страницы следует использовать команду HTTP POST. Если используются скрытые поля, и страница обрабатывается в ответ на ссылку или команду HTTP GET, то скрытые поля не будут доступны. Рекомендации по использованию см. в разделе Рекомендации по управлению состоянием ASP.NET.

Файлы cookie

Объект cookie представляет собой небольшой объем данных, хранимых в текстовом файле в файловой системе клиента или в памяти во время клиентского сеанса обозревателя. Он содержит специфичные для узла сведения, которые отправляются клиенту сервером вместе с выходными данными страницы. Объекты cookies могут быть временными (т. е. с определенными сроками и датами действия) или постоянными.

Объекты cookie можно использовать для хранения сведений об отдельном клиенте, сеансе или приложении. Объекты cookie сохраняются на клиентском устройстве, и когда обозреватель запрашивает страницу, клиент отправляет сведения, содержащиеся в объекте cookie, вместе со сведениями о запросе. Сервер может прочитать объект cookie и извлечь его значение. Очень часто объект cookie используется для хранения лексемы (иногда зашифрованной), указывающей, что этот пользователь уже зарегистрирован в приложении.

75x4ha6s.alert_security(ru-ru,VS.100).gifПримечание о безопасности.

Обозреватель может послать данные обратно только на тот сервер, который первоначально создал объект cookie. Тем не менее злоумышленники могут получить доступ к объектам cookie и прочитать их содержимое. Рекомендуется не хранить важные сведения, такие как имя пользователя или пароль, в объекте cookie. Имеет смысл хранить в объекте cookie определяющий пользователя маркер, который затем использовать для поиска конфиденциальной информации на сервере.

Дополнительные сведения о работе с cookies см. в разделах Cookies и Рекомендации по управлению состоянием ASP.NET.

Строки запроса

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

http://www.contoso.com/listwidgets.aspx?category=basic&price=100

В этом URL-пути строка запроса начинается со знака вопроса (?) и включает две пары атрибут/значение, одна из которых называется «category», а вторая — «price».

Строки запросов представляют собой простой, но ограниченный способ поддержки сведений о состоянии. С их помощью можно легко передавать сведения с одной страницы на другую, например передать номер продукта с одной страницы на ту, где он будет обработан. Однако в некоторых обозревателях и клиентских устройствах существует ограничение длины адреса URL в 2083 знака.

75x4ha6s.alert_security(ru-ru,VS.100).gifПримечание о безопасности.

Сведения, переданные в строку запроса, могут быть подделаны злоумышленником. Не помещайте в строку запроса важные или конфиденциальные данные. Кроме того, пользователь может сделать закладку на URL-адрес или отправить URL-адрес другим пользователям, тем самым передавая вместе с адресом и данные. Дополнительные сведения см. в разделах Рекомендации по управлению состоянием ASP.NET и Практическое руководство. Защита от использования сценариев в веб-приложениях с помощью применения кодирования HTML к строкам.

Чтобы значения строки запроса были доступны в процессе обработки страницы, для отправки страницы следует использовать команду HTTP GET. То есть невозможно воспользоваться строкой запроса, если страница обрабатывается в ответ на команду HTTP POST. Рекомендации по использованию см. в разделе Рекомендации по управлению состоянием ASP.NET.

ASP.NET предлагает различные способы поддержания сведений о состоянии на сервере вместо сохранения информации на стороне клиента. С помощью управления состоянием на сервере можно уменьшить объем сведений, отправляемых клиенту для сохранения состояния, однако при этом используются дорогостоящие ресурсы на сервере. В следующих разделах описаны три средства управления состоянием на сервере: состояние приложения, состояние сеанса и свойства профиля.

Состояние приложения

ASP.NET позволяет сохранять значения с помощью состояния приложения, которое является экземпляром класса HttpApplicationState, для всех активных веб-приложений. Состояние приложения — это механизм глобального хранилища, который доступен со всех страниц веб-приложения. Таким образом, состояние приложения полезно для хранения информации, которая должна поддерживаться между циклами сервера и между запросами для страниц. Дополнительные сведения см. в разделе Общие сведения о состоянии приложения ASP.NET.

Состояние приложения хранится в словаре ключей/значений, создаваемом во время каждого запроса к определенному адресу URL. К этой структуре можно добавлять специфичные для приложения сведения, которые будут храниться в промежутках между запросами страниц.

После добавления специфичных для приложения сведений к состоянию приложения ими управляет сервер. Рекомендации по использованию см. в разделе Рекомендации по управлению состоянием ASP.NET.

Состояние сеанса

ASP.NET позволяет сохранять значения с помощью состояния сеанса, которое является экземпляром класса HttpSessionState, для всех активных сеансов веб-приложений. Для получения общих сведений см. Общие сведения о состоянии сеанса ASP.NET.

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

Состояние сеанса структурировано как словарь ключей/значений, используемый для хранения специфичных для сеанса сведений, которые необходимо отслеживать в промежутках между циклами запроса к серверу и между запросами страниц. Дополнительные сведения см. в разделе Общие сведения о состоянии сеанса ASP.NET.

С помощью состояния сеанса можно выполнять следующие задачи:

  • Определять уникальные запросы обозревателя или клиентского устройства и сопоставлять их с отдельным экземпляром сеанса на сервере.

  • Сохранять специфичные для сеанса сведения на сервере, чтобы использовать их в нескольких запросах обозревателей или клиентских устройств в течение одного сеанса.

  • Вызывать необходимые события управления сеансом. Кроме того, можно написать код приложения, использующий эти события.

После добавления специфичных для приложения сведений к состоянию сеанса этим объектом управляет сервер. В зависимости от указанных параметров сведения о сеансе могут храниться в объектах cookie, на сервере вне процесса или на компьютере, на котором выполняется Microsoft SQL Server. Рекомендации по использованию см. в разделе Рекомендации по управлению состоянием ASP.NET.

Свойства профиля

ASP.NET предоставляет средство, называемое «свойства профиля», которое служит для хранения пользовательских данных. Это средство аналогично состоянию сеанса, за исключением того, что данные профиля не теряются по окончании сеанса пользователя. Средство «свойства профиля» использует профиль ASP.NET, хранимый в постоянном формате и связанный с отдельным пользователем. Профиль ASP.NET позволяет легко управлять сведениями о пользователе без необходимости создания и поддержания собственной базы данных. Кроме того, профиль делает пользовательские сведения доступными с помощью строго типизированного API, доступного из любого места в приложении. В профиле можно хранить объекты любого типа. Профиль ASP.NET обеспечивает систему универсального хранения, что позволяет определять и поддерживать практически любой тип данных, по-прежнему предоставляя данные строго типизированным образом.

Чтобы использовать параметры профиля, необходимо настроить поставщик профиля. В ASP.NET имеется класс SqlProfileProvider, позволяющий хранить данные профиля в базе данных SQL, но можно также создать свой собственный класс поставщика профиля, который хранит данные профиля в другом формате и посредством другого механизма хранения, например в XML-файле или даже в веб-службе.

Поскольку данные, размещенные в свойствах профиля, не сохраняются в памяти приложения, они сохраняются при перезагрузке IIS и перезапуске рабочих процессов без потери данных. Кроме того, свойства профиля могут быть сохранены на протяжении несколько процессов, как в веб-фермах или веб-саде. Дополнительные сведения см. в разделе Общие сведения о свойствах профилей ASP.NET.

Показ: