Опубликован: 24.05.2010 | Уровень: специалист | Доступ: платный
Лекция 9:

Технология ASP.Net : Управление состоянием

В ASP.Net предоставляет два типа управления состоянием веб – приложения: на клиенте и на сервере. Каждый из этих типов обладает отличительными особенностями, с которыми мы и познакомимся в ходе лекции.

Управление состоянием веб – приложения на стороне клиента

Преимущества хранения информации на стороне клиента:

  1. Лучшая масштабируемость. При управлении состоянием на сервере каждый подключившийся к веб-серверу клиент занимает часть ресурсов сервера. Если сайт одновременно посещают сотни и тысячи пользователей, для хранения их состояния им потребуется много памяти, которая может стать узким местом. Устранить его можно, переложив управление данными состояния на пользователей;
  2. Поддержка множества веб-серверов. При управлении состоянием на клиенте обработку поступающих запросов можно распределить среди множества веб-серверов, не модифицируя код приложения, так как клиент предоставляет веб-серверу всю необходимую информацию. При управлении состоянием на сервере клиент в середине сеанса может обратится к другому серверу, но у того может не оказаться доступа к состоянию клиента. При управлении состоянием на сервере с использованием группы серверов необходима интеллектуальная балансировка нагрузки (пересылающая запросы одного клиента одному и тому же серверу) либо централизованное управление состоянием (когда состояние хранится в центральной базе данных, доступной всем веб-серверам).

Методы хранения сведений на стороне клиента, необходимых для управления состоянием:

  • 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 можно добавлять пользовательские значения. В следующем примере после проверки наличия объекта 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, отображается дата последнего посещения страницы пользователем:

// Проверка наличия объекта 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.