Необходимо сохранять информацию о состоянии веб-страниц и элементов управления ими. Однако, поскольку веб-приложения построены на основе протокола HTTP, который не сохраняет состояние, сохранение информации о состоянии становится очень трудным. Для решения этой проблемы технология ASP.NET 2.0 предоставляет различные решения, такие как использование сеанса, файлов cookie, состояния просмотра, состояния управления, скрытых полей, строк запроса, персонализированной конфигурации пользователя (профиля) и т. д. Для использования технологии ASP.NET 2.0 для создания серверных элементов управления также очень важно сохранять информацию о состоянии. Основное решение — использовать состояние представления и состояние элемента управления. В этой статье подробно объясняются базовые знания о состоянии представления (ViewState) и описывается метод применения состояния представления с помощью типичных приложений.
Обзор состояния просмотра
Состояние просмотра — это очень важная технология, которая позволяет странице и элементам управления на странице сохранять информацию о состоянии во время прохождения туда и обратно от сервера к клиенту и обратно от клиента. Таким образом, эффект страницы с сохранением состояния и непрерывно выполняемый эффект может быть создан поверх среды без сохранения состояния, такой как Интернет. В этом разделе в основном представлены операционный механизм, методы приложения, типы хранимых данных, производительность и безопасность, блокировка состояния представления (это новая функция ASP.NET 2.0), преимущества и недостатки состояния представления.
(1)
Конкретный процесс выполнения состояния представления работающего механизма таков: всякий раз, когда пользователь запрашивает страницу .aspx, платформа .NET сначала сериализует данные о состоянии связанных элементов управления в строку, а затем преобразует ее в файл с именем __VIEWSTATE Значение скрытого поля отправляется клиенту. Если страница запрашивается впервые, серверный элемент управления также будет выполнен в первый раз. Скрытое поле с именем __VIEWSTATE содержит только информацию по умолчанию для элемента управления, которая обычно пуста или равна нулю. В последующем событии обратной передачи состояние свойства серверного элемента управления, доступное в предыдущей обратной передаче, сохраняется во ViewState. Это позволяет серверному элементу управления отслеживать состояние до того, как произойдет обрабатываемое в данный момент событие обратной передачи. Об этих процессах заботится платформа .NET, и для пользователей выполнение страницы .aspx будет иметь эффект непрерывного выполнения.
(2) Сохраненные типы данных
Состояние просмотра может хранить несколько типов данных, и для повышения эффективности работы само состояние представления также включает набор оптимизированных методов сериализации для распространенных типов. Типы данных, поддерживаемые методом сериализации состояния представления по умолчанию, включают следующие: String, Int32, Unit, Color, Array, ArrayList, HashTable и преобразователь настраиваемых типов TypeConverter.
Состояние просмотра оптимизировано для объектов Array, ArrayList и HashTable, содержащих перечисленные выше типы. Поэтому при использовании состояния представления в элементах управления следует стараться ограничить использование простыми типами данных, описанными выше, а также оптимизированными типами. Здесь нам нужно сосредоточиться на пользовательском преобразователе типов TypeConverter, который предоставляет унифицированный метод для преобразования типа значения в другие типы и доступа к стандартным значениям и подсвойствам. Например, вы можете использовать TypeConverter для преобразования строки в числовое значение или числового значения в строку. Если преобразователь типов отсутствует, платформа страниц будет использовать функцию двоичной сериализации, предоставляемую платформой .NET, для сериализации объекта. Этот процесс требует очень много ресурсов.
(3) Производительность и безопасность.
При использовании состояния просмотра объекты необходимо сначала сериализовать, а затем десериализовать посредством обратной передачи. Итак, нам нужно кое-что знать о производительности ViewState. По умолчанию ViewState элемента управления будет включен. Если вам не нужно использовать ViewState, лучше всего его отключить. ViewState больше не понадобится в следующих ситуациях: (1) элемент управления не определяет события на стороне сервера (в настоящее время все события элемента управления являются событиями на стороне клиента и не участвуют в обратной передаче); нет динамических или привязанных к данным значений свойств. Способ отключения состояния просмотра — установить для параметра EnableViewState элемента управления значение «false», то есть EnableViewState="false".
По умолчанию, когда содержимое, связанное с состоянием просмотра, компилируется и отправляется клиенту, читатель увидит содержимое скрытого поля __VIEWSTATE в HTML-коде страницы. Это бессмысленные строки, которые являются результатом кодирования соответствующего контента платформой .NET с помощью кодировки Base64. Они передаются между клиентом и сервером в виде открытого текста. В некоторых случаях, например, когда речь идет о конфиденциальном содержимом, таком как пароли, учетные записи, строки подключения и т. д., использовать метод по умолчанию очень небезопасно. С этой целью платформа .NET предоставляет два механизма безопасности для ViewState:
Механизм проверки:
вы можете указать платформе .NET добавить хеш-код к данным ViewState, установив атрибут EnableViewStateMAC="true" (хэш-код — это A Тип SHA1 длиной 160 бит, поэтому это серьезно повлияет на производительность выполнения). Когда происходит событие обратной передачи, хеш-код будет восстановлен и должен соответствовать исходному хеш-коду. Таким образом, можно эффективно проверить, можно ли подделать ViewState во время процесса передачи. По умолчанию .NET Framework использует алгоритм SHA1 для генерации хеш-кодов ViewState. Кроме того, вы также можете выбрать алгоритм MD5, установив
· Механизм шифрования
использует шифрование для защиты фактических значений данных в полях ViewState. Во-первых, необходимо установить EnableViewStatMAC="true", как описано выше. Затем установите для типа проверки MachineKey значение 3DES, то есть
(4) Блокировка состояния просмотра.
Приведенный выше контент знакомит с некоторыми базовыми знаниями о состоянии просмотра. Однако некоторые читатели могут быть сбиты с толку: что, если в некоторых случаях данные состояния представления станут очень большими? Это, очевидно, будет иметь некоторые непредвиденные последствия. С этой целью в ASP.NET 2.0 добавлена новая функция под названием «блокировка состояния просмотра». Если объем данных в состоянии просмотра становится слишком большим, разделение состояния просмотра автоматически разбивает данные на несколько фрагментов и помещает данные в несколько скрытых полей формы.
Чтобы включить фрагментирование состояния представления, задайте для свойства MaxPageStateFieldLength максимальный размер, разрешенный в одном поле состояния представления (в байтах). Когда страница отправляется обратно на сервер, страница анализирует строку состояния просмотра на этапе инициализации страницы и восстанавливает информацию о свойствах на странице. Значение по умолчанию — -1, что означает, что максимальный размер отсутствует и состояние просмотра не будет разделено на фрагменты.
(5) Преимущества и недостатки
Использование состояния просмотра имеет следующие три преимущества: 1. Оно потребляет меньше ресурсов сервера (по сравнению с приложением и сеансом). Поскольку данные состояния просмотра записываются на клиентский компьютер. 2. Простота обслуживания. По умолчанию система .NET автоматически включает ведение данных о состоянии управления. 3. Расширенные функции безопасности. Значения в состоянии просмотра хешируются, сжимаются и кодируются с использованием реализации Unicode, что более безопасно, чем использование скрытых полей.
Использование состояния просмотра имеет следующие три недостатка: 1. Проблемы производительности. Поскольку состояние просмотра хранится на самой странице, если сохраняется большое значение, пользователь все равно может замедляться при отображении и отправке страницы, даже если состояние просмотра разбито на части. 2. Ограничения оборудования. Мобильные устройства могут не иметь достаточного объема памяти для хранения больших объемов данных состояния просмотра. Поэтому при перемещении серверных элементов управления на устройство используется другой метод реализации. 3. Потенциальные угрозы безопасности. Состояние просмотра хранится в одном или нескольких скрытых полях на странице. Хотя состояние просмотра хранит данные в хешированном формате, его можно подделать. Если вы просматриваете источник вывода страницы напрямую, вы можете увидеть информацию в скрытых полях, что может привести к потенциальным проблемам безопасности.
Типичные применения
В процессе разработки серверных элементов управления с использованием технологии ASP.NET 2.0 существует множество аспектов, в которых можно использовать состояние представления. Для реализации свойств серверного элемента управления обычно используется словарь ViewState. ViewState имеет тип System.Web.UI.StateBag — словарь пар ключ/значение, в котором могут храниться значения свойств управления сервером. Ниже используется типичный пример для иллюстрации метода приложения ViewState.
В пользовательском серверном элементе управления LabelInViewState реализованы два свойства Text и TextInViewState. Первый создается с использованием частных переменных, а второй реализуется с помощью ViewState. Все они используются для получения или установки текстового содержимого. Исходный код файла реализации пользовательского элемента управления LabelInViewState.cs выглядит следующим образом.
использование системы; использование System.Collections.Generic; использование System.ComponentModel; использование System.Text; использование System.Web; использование System.Web.UI; используя System.Web.UI.WebControls;пространство имен WebControlLibrary{ [DefaultProperty("Текст")] [ToolboxData("<{0}:LabelInViewState runat=server></{0}:LabelInViewState>")] публичный класс LabelInViewState: WebControl { Private string _text //Реализуем атрибут Text public string Text {; получать { return (_text == null)? string.Empty: _text; } установить {_text = значение}; } //Используем ViewState для реализации свойства TextInViewState public string TextInViewState { получать { String s = (String)ViewState["TextInViewState"]; return ((s == null) ? String.Empty: s); } set {ViewState["TextInViewState"] = значение}; } // Переопределить метод RenderContents protected override void RenderContents(HtmlTextWriter output) { output.Write("Текст = "); вывод.Запись(Текст); output.Write(" "); output.Write("TextInViewState = "); вывод.Запись(TextInViewState); } } } |
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <%@ Register Namespace="WebControlLibrary" Assembly="WebControlLibrary" TagPrefix="sample" %> <скрипт runat="сервер"> void Button1_Click (отправитель объекта, EventArgs e) { demoLabel.Text = TextBox1.Text; demoLabel.TextInViewState = TextBox2.Text; } </скрипт> <head runat="сервер"> </голова> <body style="размер шрифта: маленький;"> <form id="form1" runat="server"> <div> Имя: |
Приведенный выше код, отображаемый на странице, включает два текстовых поля, две кнопки и пользовательский серверный элемент управления LabelInViewState. Как показано в обработчике событий Button1_Click, при нажатии кнопки «Отправить» элемент управления LabelInViewState получит текст в текстовом поле и отобразит его. Рендеринг приложения показан на рисунках 1 и 2.
Рис. 1. Нажмите кнопку «Отправить». | Рис. 2. Нажмите кнопку перезагрузки. |