Поделиться через


Управление состоянием

Подсказка

Это фрагмент электронной книги "Blazor для разработчиков веб-форм ASP NET для Azure", доступной в документации .NET или в виде бесплатного PDF-файла, который можно загрузить и прочитать в автономном режиме.

Миниатюра обложки электронной книги для Blazor-for-ASP-NET-Web-Forms-Developers.

Управление состоянием — это ключевая концепция приложений веб-форм, осуществляемое с использованием ViewState, состояния сеанса, состояния приложения и механизма обратной передачи. Эти функции платформы с отслеживанием состояния помогли скрыть управление состоянием, необходимое для приложения, и позволили разработчикам приложений сосредоточиться на реализации функциональности. С ASP.NET Core и Blazor некоторые из этих функций были перенесены и некоторые из них были полностью удалены. В этой главе рассматривается, как сохранять состояние и обеспечивать ту же функциональность с новыми возможностями в Blazor.

Управление состоянием запроса с помощью ViewState

При обсуждении управления состоянием в приложении Web Forms многие разработчики сразу же думают о ViewState. В веб-формах ViewState управляет состоянием содержимого между HTTP-запросами путем отправки большого закодированного блока текста в браузер. Поле ViewState может быть перегружено содержимым со страницы, содержащей множество элементов, потенциально расширяясь до нескольких мегабайт в размерах.

При использовании Blazor Server приложение поддерживает постоянное подключение к серверу. Состояние приложения, называемое контуром, хранится в памяти сервера, пока подключение считается активным. Состояние будет удалено только при переходе пользователя из приложения или определенной страницы в приложении. Все члены активных компонентов доступны во время взаимодействий с сервером.

Существует несколько преимуществ этой функции:

  • Состояние компонента доступно без труда и не пересоздаётся между взаимодействиями.
  • Состояние не передается в браузер.

Однако существуют некоторые недостатки в сохраняемости компонентов в памяти, которые следует учитывать:

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

По приведенным выше причинам не следует полагаться только на состояние компонента, которое будет находиться в памяти на сервере. Приложение также должно включать в себя резервное хранилище данных для данных между запросами. Некоторые простые примеры этой стратегии:

  • В приложении корзины для покупок сохраните содержимое новых элементов, добавленных в корзину в записи базы данных. Если состояние на сервере потеряно, его можно восстановить из записей базы данных.
  • В многокомпонентной веб-форме пользователи ожидают, что приложение запоминает значения между каждым запросом. Записывайте данные между каждой из записей пользователя в хранилище данных, чтобы их можно было получить и собрать в окончательную структуру ответа формы при завершении многокомпонентной формы.

Дополнительные сведения об управлении состоянием в приложениях Blazor см. в разделе ASP.NET Управление состоянием Core Blazor.

Поддержание состояния с помощью сеанса

Разработчики веб-форм могут поддерживать сведения о текущем действии пользователя с Microsoft.AspNetCore.Http.ISession объектом словаря. Достаточно легко добавить объект со строковым ключом в приложение Session, и этот объект будет доступен позже во время взаимодействия пользователя с приложением. При попытке исключить управление взаимодействием с HTTP, Session объект упрощает поддержание состояния.

Подпись объекта .NET Framework Session не совпадает с объектом ASP.NET Core Session . Перед принятием решения о миграции и использовании новой функции состояния сеанса следует рассмотреть документацию по новому ASP.NET Core Session.

В ASP.NET Core и Blazor Server поддерживается использование сеанса, однако рекомендуется избегать его применения, предпочитая надлежащее хранение данных в хранилище данных. Состояние сеанса также не работает, если посетители отклоняют использование HTTP-файлов cookie в приложении из-за проблем конфиденциальности.

Конфигурация ASP.NET Core и состояния сеанса доступна в разделе "Управление сеансами и состоянием" в статье о ASP.NET Core.

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

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

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

Построение объекта для поддержания состояния приложения и его потребления может выглядеть следующим образом:

public class MyApplicationState
{
    public int VisitorCounter { get; private set; } = 0;

    public void IncrementCounter() => VisitorCounter += 1;
}
app.AddSingleton<MyApplicationState>();
@inject MyApplicationState AppState

<label>Total Visitors: @AppState.VisitorCounter</label>

Объект MyApplicationState создается только один раз на сервере, и значение VisitorCounter извлекается и выводится в метке компонента. Значение VisitorCounter должно сохраняться и извлекаться из резервного хранилища данных для обеспечения устойчивости и масштабируемости.

В браузере

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

  • localStorage — область действия всего браузера пользователя. Если страница перезагрузится, браузер будет закрыт и открыт заново, или если будет открыта другая вкладка с тем же URL-адресом, браузер предоставит тот же localStorage.
  • sessionStorage — область действия на текущей вкладке браузера пользователя. Если вкладка перезагрузится, состояние сохраняется. Тем не менее, если пользователь открывает другую вкладку в приложении или закрывается и повторно открывает браузер, состояние теряется.

Вы можете написать пользовательский код JavaScript для взаимодействия с этими функциями или существует ряд пакетов NuGet, которые можно использовать, предоставляя эту функциональность. Одним из таких пакетов является Microsoft.AspNetCore.ProtectedBrowserStorage.

Инструкции по использованию этого пакета для взаимодействия с localStorage и sessionStorage см. в статье Blazor State Management.