Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Подсказка
Это фрагмент электронной книги "Blazor для разработчиков веб-форм ASP NET для Azure", доступной в документации .NET или в виде бесплатного PDF-файла, который можно загрузить и прочитать в автономном режиме.
Управление состоянием — это ключевая концепция приложений веб-форм, осуществляемое с использованием 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.