Технология ASP.Net : Управление состоянием
В ASP.Net предоставляет два типа управления состоянием веб – приложения: на клиенте и на сервере. Каждый из этих типов обладает отличительными особенностями, с которыми мы и познакомимся в ходе лекции.
Управление состоянием веб – приложения на стороне клиента
Преимущества хранения информации на стороне клиента:
- Лучшая масштабируемость. При управлении состоянием на сервере каждый подключившийся к веб-серверу клиент занимает часть ресурсов сервера. Если сайт одновременно посещают сотни и тысячи пользователей, для хранения их состояния им потребуется много памяти, которая может стать узким местом. Устранить его можно, переложив управление данными состояния на пользователей;
- Поддержка множества веб-серверов. При управлении состоянием на клиенте обработку поступающих запросов можно распределить среди множества веб-серверов, не модифицируя код приложения, так как клиент предоставляет веб-серверу всю необходимую информацию. При управлении состоянием на сервере клиент в середине сеанса может обратится к другому серверу, но у того может не оказаться доступа к состоянию клиента. При управлении состоянием на сервере с использованием группы серверов необходима интеллектуальная балансировка нагрузки (пересылающая запросы одного клиента одному и тому же серверу) либо централизованное управление состоянием (когда состояние хранится в центральной базе данных, доступной всем веб-серверам).
Методы хранения сведений на стороне клиента, необходимых для управления состоянием:
- ViewState или состояние отображения – отслеживает значения элементов управления;
- ControlState или состояние элемента управления – применяется при создании пользовательских элементов управления, как правило, используется для корректной работы пользовательского ЭУ, даже в случае отключения ViewState ;
- Скрытые поля – данные сохраняются в HTML – форме и являются невидимыми для браузера;
- Cookie – файлы – эти файлы хранят введенные в браузер значения, которые браузер отсылает на сервер при последующих запросах данной страницы;
- Строки запроса – сохраняют значения в составе URL.
ViewState
View State —называется способ хранения данных о состоянии страницы в скрытом поле формы на самой странице. Данные из скрытого поля используются, чтобы для конкретного клиента установить состояние серверных объектов, формирующих страницу.
Чтобы отключить состояние отображения веб-элемента управления, присвойте его свойству EnableViewState значение False. Это ускорит обработку данных на сервере и уменьшит размер страницы.
Также можно откоючить ViewState и на уровне страницы:
<%@ Page EnableViewState="false" %>
Важно следующее: по – умолчанию, состояние отображение включено у каждого элемента управления, что не всегда хорошо. Прежде всего, при использовании ViewState страница становится "тяжелее", как для обработки, так и для передачи клиенту, из-за дополнительного объема. Далее, дополнительная нагрузка связана с формированием и разбором данных скрытого поля ViewState. И, наконец, для обработки View State все-таки требуется память на сервере.
Поэтому перед началом разработки следует определиться с тем на каких страницах использование ViewState необходимо, для остальных же, лучше состояние отображения отключить.
В случае, если в ViewState планируется хранить конфиденциальные данные (чего, строго говоря, следует, при возможности, избегать), можно включить шифрование
Чтобы включить шифрование состояния отображения в приложении, в файле Web.config присвойте атрибуту <pages viewStateEncryptionMode> значение Always:
<configuration> <system.web> <pages viewStateEncryptionMode="Always"/> </system.web> </configuration>
В объект ViewState можно добавлять пользовательские значения. В следующем примере после проверки наличия объекта ViewState, записывается дата последнего посещения пользователя:
if (ViewState["lastVisit"] != null) { Labell.Text = (string)ViewState["lastVisit"]; } else { Labell.Text = "lastVisit ViewState not defined."; } ViewState.Add("lastVisit", DateTime.Now.ToString());
В следующем примере после проверки наличия объекта ViewState, отображается дата последнего посещения страницы пользователем:
// Проверка наличия объекта ViewState if (ViewState["lastVisit"] != null) { Labell Text = ((DateTime)ViewState["lastVisit"]).ToString(); } else { Labell.Text = "lastVisit ViewState not defined"; } ViewState["lastVisit"] = DateTime.Now;
ControlState
Обычно ControlState используется для того, чтобы элемент управления работал корректно в случае EnableViewState = false. Если на работу вашего ЭУ никак не влияет ViewState – то нет смысла применять ControlState.
В следующем примере кода демонстрируется, каким образом класс, производный от класса PageStatePersiste r (предоставляет базовую функциональность для механизмов сохранения состояния представления ASP.NET.), инициализирует свойство ControlState. В данном примере, свойство ControlState назначается полю Second объекта Pair, и сериализуется при помощи класса ObjectStateFormatter. При вызове метода Load класс ObjectStateFormatte r используется для сериализации данных о состоянии представления и состоянии элемента управления, а свойство ControlState инициализируется из результирующего объекта Pair с полем Second 1http://msdn.microsoft.com/ru-ru/library/system.web.ui.pagestatepersister.controlstate.aspx
public override void Load() { Stream stateStream = GetSecureStream(); StreamReader reader = new StreamReader(stateStream); IStateFormatter formatter = this.StateFormatter; string fileContents = reader.ReadToEnd(); Pair statePair = (Pair)formatter.Deserialize(fileContents); ViewState = statePair.First; ControlState = statePair.Second; reader.Close(); stateStream.Close(); }
Скрытые поля
Преимущества использования скрытых полей:
- Не требуются ресурсы сервера. Скрытое поле сохраняется на странице и считывается с нее.
- Широкая поддержка. Практически все обозреватели и клиентские устройства поддерживают формы со скрытыми полями.
- Простая реализация. Скрытые поля представляют собой стандартные элементы управления HTML, которым не требуются сложные программные алгоритмы.
Недостатки использования скрытых полей:
- Потенциальная угроза безопасности. Скрытое поле может быть подделано. Сведения в скрытом поле можно увидеть, если источник выходных данных страницы просматривается напрямую, что создает потенциальную угрозу безопасности.
- сложные типы данных. Скрытые поля содержат поле с одним строковым значением, в которое помещается информация. Для сохранения нескольких значений необходимо реализовать разделенные строки и код, анализирующий эти строки.
- Вопросы производительности. Поскольку скрытые поля сохраняются на самой странице, при сохранении больших значений процесс отображения и отправки страницы может замедлиться.
- Ограничения размера хранилища. Если объем данных в скрытом поле становится слишком большим, то некоторые прокси-серверы и брандмауэры будут запрещать доступ к странице, содержащей эти данные.
Элемент управления HiddenField хранит единственную переменную в свойстве Value, он должен быть явно добавлен на страницу. Скрытые поля хранят информацию для одной страницы, поэтому бесполезно сохранять в них сеансовые данные. При использовании скрытых полей страницы должны отправляться на сервер с помощью HTTP-метода POST (по щелчку кнопки), а не HTTP GET (по щелчку ссылки).
Пример сохранения данных:
HiddenFieldl.Value = control.Value.ToString();
Свойство HiddenField. Value имеет тип String, поэтому перед его установкой требуется преобразовать данные в тип String.