ASP.NET state management

Приложения ASP.NET размещаются на веб-серверах. Доступ к ним осуществляется через stateless протокол HTTP. По сути, если приложение использует stateful взаимодействие, ему необходимо осуществить управление состоянием (state management) самостоятельно. ASP.NET обеспечивает различные способы для управления состоянием приложений в ASP.NET[1]:

  • Состояние приложения (Application state),
  • Состояние представления (View State),
  • Состояние сеанса (Session State),
  • Строка запроса (URL),
  • Cookie-наборы,
  • Профили (Profiles).

Состояние приложения (Application state)[ | ]

Состояние приложения применяется в основном для хранения глобальных данных в рамках приложения. Оно находится в памяти сервера и позволяет хранить все типы данных .NET. Время жизни переменных совпадает со временем жизни приложения ASP.NET. Переменные состояния приложения устанавливаются и инициализируются при событии Application_OnStart на этапе загрузки первого экземпляра приложения и остаются доступными до тех пор, пока существует последний экземпляр приложения. Эти переменные доступны на всех веб-страницах через встроенный объект Application и идентифицируются по их именам[2].

Состояние представления (View state)[ | ]

View state ссылается на уровень страницы механизма управления состоянием (state management mechanism), который используется HTML страницами для сохранения состояния компонентов веб-формы и widgets. При запросе на сервер текущее состояние компонентов (controls) ируется и отправляется на сервер в скрытом поле __VIEWSTATE. Сервер посылает назад переменную, поэтому, когда страница повторно прорисовывается (re-rendered), компоненты (controls) отображаются (render) с их последним состоянием. На серверной стороне приложение может изменить viewstate, если результаты обработки обновляют хотя бы один элемент управления на странице. Состояния каждого компонента деируется на сервере и доступно для использования в ASP.NET страницах через коллекцию ViewState[3].

Состояние сеанса (Session state)[ | ]

Session state — это набор пользовательских переменных, которые продолжают существовать в течение сеанса пользователя. Эти переменные уникальны для различных экземпляров пользовательских сессий, и доступны через коллекцию Session. Эти переменные (Session variables) можно настроить таким образом, чтобы они автоматически уничтожались по прошествии определённого времени неактивности пользователя, даже, если сессия ещё не завершена. На клиентской стороне пользовательская сессия идентифицируется при помощи cookie или при помощи ID сессии в её URL[2].

ASP.NET поддерживает следующие режимы существования переменных сессии[2]:

InProc
Переменные сессии поддерживаются внутри процесса ASP.NET. Однако, в этом режиме переменные уничтожаются, когда процесс ASP.NET запускается повторно, либо завершается.
StateServer
В этом режиме ASP.NET запускает отдельную службу (service), которая поддерживает переменные состояния. Так как управление состоянием (state management) происходит за пределами ASP.NET процесса, это негативно сказывается на производительности, но позволяет многим экземплярам ASP.NET использовать общий сервер состояний, таким образом позволяя приложению ASP.NET быть равномерно распределённым на различных серверах (с балансировкой нагрузки и масштабированием на несколько серверов). Так как служба управления состоянием (state management service) запускается независимо от ASP.NET, переменные могут существовать после завершения работы процесса ASP.NET.
SQLServer
В этом режиме, переменные состояния (state variables) хранятся на database server, и доступны через SQL. Переменные состояния могут существовать после завершения процесса ASP.NET так же как и в предыдущем случае.
Custom
Этот режим требует указать свой поставщик хранилища данных о сессиях с помощью атрибута customProvider. Чаще всего используется тогда, когда информацию о сеансах необходимо хранить в базе данных, отличной от SqlServer (например, MySql или Oracle).
Off
Управление состоянием сеансов отключено.


Пример использования сессий
    Session["Name"] = "Василий Пупкин"; //Session["Name"] = (object);
    Session.Add("Age", 16);
    //Забираем значение.
    Response.Write((string)Session["Name"] + ": " + Session["Age"].ToString() + "-years old.");
Результат, записанный в http-ответ web-сервера

Василий Пупкин: 16-years old.

Строка запроса (URL)[ | ]

Небольшое количество информации можно передавать от страницы на сервер при помощи параметров строки запроса, таким образом обеспечивая поддержку состояния. Это самый простой способ поддержки состояния в ASP.NET приложениях, охватывающий только одну страницу. Если пользователь закроет браузер, состояние утрачивается (если не применять дополнительные приёмы по сохранению данных состояния, например, в cookie). Недостатками этого метода являются:

  • ограниченность размера строки запроса (1-2 Кбайт),
  • небезопасность: строка может быть легко изменена пользователем[1].

Примечания[ | ]

  1. 1 2 Мак-Дональд Мэтью. Microsoft ASP.NET 4 с примерами на C# 2010 для профессионалов. — М.: Apress, 2011. — 1424 с. — ISBN 978-5-8459-1702-7.
  2. 1 2 3 INFO: ASP.NET State Management Overview. Дата обращения 23 октября 2007. Архивировано 26 октября 2005 года.
  3. ViewState in ASP.NET (недоступная ссылка). Дата обращения 23 октября 2007. Архивировано 14 октября 2007 года.