Учебники

ASP.NET — Управление государством

Протокол передачи гипертекста (HTTP) — это протокол без сохранения состояния. Когда клиент отключается от сервера, механизм ASP.NET отбрасывает объекты страницы. Таким образом, каждое веб-приложение может масштабироваться для одновременного обслуживания множества запросов без исчерпания памяти сервера.

Однако должен существовать некоторый метод для хранения информации между запросами и извлечения ее при необходимости. Эта информация, т. Е. Текущее значение всех элементов управления и переменных для текущего пользователя в текущем сеансе, называется состоянием.

ASP.NET управляет четырьмя типами состояний:

  • Просмотр состояния
  • Государство контроля
  • Состояние сеанса
  • Состояние приложения

Просмотр состояния

Состояние просмотра — это состояние страницы и всех ее элементов управления. Он автоматически поддерживается в сообщениях ASP.NET Framework.

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

Состояние просмотра может быть включено или отключено для:

  • Все приложение , задав свойство EnableViewState в разделе <pages> файла web.config.

  • Страница путем установки атрибута EnableViewState директивы Page, например, <% @ Page Language = «C #» EnableViewState = «false»%>

  • Элемент управления , установив свойство Control.EnableViewState.

Все приложение , задав свойство EnableViewState в разделе <pages> файла web.config.

Страница путем установки атрибута EnableViewState директивы Page, например, <% @ Page Language = «C #» EnableViewState = «false»%>

Элемент управления , установив свойство Control.EnableViewState.

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

Класс StateBag имеет следующие свойства:

свойства Описание
Имя элемента) Значение элемента состояния представления с указанным именем. Это свойство по умолчанию класса StateBag.
подсчитывать Количество элементов в коллекции состояния просмотра.
Ключи Коллекция ключей для всех предметов в коллекции.
Ценности Сбор значений для всех предметов в коллекции.

Класс StateBag имеет следующие методы:

методы Описание
Добавить (имя, значение) Добавляет элемент в коллекцию состояний просмотра, и существующий элемент обновляется.
Очистить Удаляет все предметы из коллекции.
Равно (Объект) Определяет, равен ли указанный объект текущему объекту.
завершать Позволяет освободить ресурсы и выполнить другие операции очистки.
GetEnumerator Возвращает перечислитель, который перебирает все пары ключ / значение объектов StateItem, хранящихся в объекте StateBag.
GetType Получает тип текущего экземпляра.
IsItemDirty Проверяет объект StateItem, хранящийся в объекте StateBag, чтобы определить, был ли он изменен.
Удалить (имя) Удаляет указанный элемент.
SetDirty Устанавливает состояние объекта StateBag, а также свойство Dirty каждого из содержащихся в нем объектов StateItem.
SetItemDirty Устанавливает свойство Dirty для указанного объекта StateItem в объекте StateBag.
Нанизывать Возвращает строку, представляющую объект состояния bag.

пример

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

Код файла разметки выглядит следующим образом:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="statedemo._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

   <head runat="server">
      <title>
         Untitled Page
      </title>
   </head>
   
   <body>
      <form id="form1" runat="server">
      
         <div>
            <h3>View State demo</h3>
         
            Page Counter:
            
            <asp:Label ID="lblCounter" runat="server" />
            <asp:Button ID="btnIncrement" runat="server" Text="Add Count" onclick="btnIncrement_Click" />
         </div>
         
      </form>
   </body>
   
</html>

Код файла для примера показан здесь:

public partial class _Default : System.Web.UI.Page
{
   public int counter
   {
      get
      {
         if (ViewState["pcounter"] != null)
         {
            return ((int)ViewState["pcounter"]);
         }
         else
         {
            return 0;
         }
      }
      
      set
      {
         ViewState["pcounter"] = value;
      }
   }
        
   protected void Page_Load(object sender, EventArgs e)
   {
      lblCounter.Text = counter.ToString();
      counter++;
   }
}

Это дало бы следующий результат:

Посмотреть демонстрацию состояния

Государство контроля

Состояние управления не может быть изменено, доступно напрямую или отключено.

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

Когда пользователь подключается к веб-сайту ASP.NET, создается новый объект сеанса. Когда состояние сеанса включено, новый объект состояния сеанса создается для каждого нового запроса. Этот объект состояния сеанса становится частью контекста, и он доступен через страницу.

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

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

Объект состояния сеанса создается из класса HttpSessionState, который определяет коллекцию элементов состояния сеанса.

Класс HttpSessionState имеет следующие свойства:

свойства Описание
Идентификатор сессии Уникальный идентификатор сеанса.
Имя элемента) Значение элемента состояния сеанса с указанным именем. Это свойство по умолчанию класса HttpSessionState.
подсчитывать Количество элементов в коллекции состояний сеанса.
TimeOut Получает и задает количество времени (в минутах) между запросами, прежде чем поставщик состояния сеанса завершит сеанс.

Класс HttpSessionState имеет следующие методы:

методы Описание
Добавить (имя, значение) Добавляет элемент в коллекцию состояний сеанса.
Очистить Удаляет все элементы из коллекции состояний сеанса.
Удалить (имя) Удаляет указанный элемент из коллекции состояний сеанса.
Удалить все Удаляет все ключи и значения из коллекции состояния сеанса.
RemoveAt Удаляет элемент по указанному индексу из коллекции состояния сеанса.

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

void StoreSessionInfo()
{
   String fromuser = TextBox1.Text;
   Session["fromuser"] = fromuser;
}

void RetrieveSessionInfo()
{
   String fromuser = Session["fromuser"];
   Label1.Text = fromuser;
}

Приведенный выше код хранит только строки в объекте словаря Session, однако он может хранить все примитивные типы данных и массивы, состоящие из примитивных типов данных, а также объекты DataSet, DataTable, HashTable и Image, а также любые пользовательские объекты. определенный класс, который наследуется от объекта ISerializable.

пример

В следующем примере демонстрируется концепция хранения состояния сеанса. На странице есть две кнопки: текстовое поле для ввода строки и метка для отображения текста, сохраненного в прошлом сеансе.

Код файла разметки выглядит следующим образом:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default"  %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

   <head runat="server">
      <title>
         Untitled Page
      </title>
   </head>
   
   <body>
      <form id="form1" runat="server">
         <div>
            &nbsp; &nbsp; &nbsp;
            
            <table style="width: 568px; height: 103px">
            
               <tr>
                  <td style="width: 209px">
                     <asp:Label ID="lblstr" runat="server" Text="Enter a String"  style="width:94px">
                     </asp:Label>
                  </td>
					
                  <td style="width: 317px">
                     <asp:TextBox ID="txtstr" runat="server" style="width:227px">
                     </asp:TextBox>
                  </td>
               </tr>
	
               <tr>
                  <td style="width: 209px"> </td>
                  <td style="width: 317px"> </td>
               </tr>
	
               <tr>
                  <td style="width: 209px">
                     <asp:Button ID="btnnrm" runat="server" 
                        Text="No action button" style="width:128px" />
                  </td>
	
                  <td style="width: 317px">
                     <asp:Button ID="btnstr" runat="server" 
                        OnClick="btnstr_Click" Text="Submit the String" />
                  </td> 
               </tr>
	
               <tr>
                  <td style="width: 209px">  </td>
	
                  <td style="width: 317px">  </td>  
               </tr>
	
               <tr>
                  <td style="width: 209px">
                     <asp:Label ID="lblsession" runat="server"  style="width:231px"  >
                     </asp:Label>
                  </td>
	
                  <td style="width: 317px">  </td>
               </tr>
	
               <tr>
                  <td style="width: 209px">
                     <asp:Label ID="lblshstr" runat="server">
                     </asp:Label>
                  </td>
	
                  <td style="width: 317px">  </td>
               </tr>
               
            </table>
            
         </div>
      </form>
   </body>
</html>

Это должно выглядеть примерно так:

представление дизайна сеанса

Код файла указан здесь:

public partial class _Default : System.Web.UI.Page 
{
   String mystr;
   
   protected void Page_Load(object sender, EventArgs e)
   {
      this.lblshstr.Text = this.mystr;
      this.lblsession.Text = (String)this.Session["str"];
   }
   
   protected void btnstr_Click(object sender, EventArgs e)
   {
      this.mystr = this.txtstr.Text;
      this.Session["str"] = this.txtstr.Text;
      this.lblshstr.Text = this.mystr;
      this.lblsession.Text = (String)this.Session["str"];
   }
}

Запустите файл и посмотрите, как он работает:

просмотр сеанса

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

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

Чтобы обеспечить использование состояния приложения, ASP.NET создает объект состояния приложения для каждого приложения из класса HTTPApplicationState и сохраняет этот объект в памяти сервера. Этот объект представлен файлом класса global.asax.

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

Класс HttpApplicationState имеет следующие свойства:

свойства Описание
Имя элемента) Значение элемента состояния приложения с указанным именем. Это свойство по умолчанию класса HttpApplicationState.
подсчитывать Количество элементов в коллекции состояний приложения.

Класс HttpApplicationState имеет следующие методы:

методы Описание
Добавить (имя, значение) Добавляет элемент в коллекцию состояний приложения.
Очистить Удаляет все элементы из коллекции состояний приложения.
Удалить (имя) Удаляет указанный элемент из коллекции состояний приложения.
Удалить все Удаляет все объекты из коллекции HttpApplicationState.
RemoveAt Удаляет объект HttpApplicationState из коллекции по индексу.
Замок() Блокирует коллекцию состояний приложения, так что только текущий пользователь может получить к ней доступ.
Разблокировка () Разблокирует коллекцию состояний приложения, чтобы все пользователи могли получить к ней доступ.

Данные о состоянии приложения обычно поддерживаются написанием обработчиков для событий:

  • Application_Start
  • Application_End
  • Ошибка приложения
  • session_start
  • Session_End

В следующем фрагменте кода показан основной синтаксис для хранения информации о состоянии приложения: