Udostępnij za pośrednictwem


Zarządzanie stanem

Napiwek

Ta zawartość jest fragmentem książki eBook Blazor for ASP NET Web Forms Developers for Azure, dostępnej na platformie .NET Docs lub jako bezpłatny plik PDF do pobrania, który można odczytać w trybie offline.

Blazor-for-ASP-NET-Web-Forms-Developers eBook cover thumbnail.

Zarządzanie stanem to kluczowa koncepcja aplikacji formularzy internetowych, ułatwiana za pomocą funkcji ViewState, Stanu sesji, Stanu aplikacji i Postback. Te stanowe funkcje platformy pomogły ukryć zarządzanie stanem wymagane dla aplikacji i umożliwić deweloperom aplikacji skupienie się na dostarczaniu ich funkcji. W przypadku ASP.NET Core i Blazor niektóre z tych funkcji zostały przeniesione i niektóre zostały całkowicie usunięte. W tym rozdziale opisano sposób utrzymania stanu i dostarczania tych samych funkcji przy użyciu nowych funkcji w rozwiązaniu Blazor.

Zarządzanie stanem żądania za pomocą funkcji ViewState

Podczas omawiania zarządzania stanem w aplikacji Web Forms wielu deweloperów natychmiast pomyśli o ViewState. W formularzach internetowych ViewState zarządza stanem zawartości między żądaniami HTTP, wysyłając do przeglądarki duży zakodowany blok tekstu. Pole ViewState może być przeciążone zawartością ze strony zawierającej wiele elementów, co potencjalnie zwiększa się do kilku megabajtów o rozmiarze.

W przypadku serwera Blazor aplikacja utrzymuje ciągłe połączenie z serwerem. Stan aplikacji, nazywany obwodem, jest przechowywany w pamięci serwera, podczas gdy połączenie jest uznawane za aktywne. Stan będzie usuwany tylko wtedy, gdy użytkownik przejdzie z dala od aplikacji lub określonej strony w aplikacji. Wszystkie elementy członkowskie aktywnych składników są dostępne między interakcjami z serwerem.

Istnieje kilka zalet tej funkcji:

  • Stan składnika jest łatwo dostępny i nie jest odbudowywany między interakcjami.
  • Stan nie jest przesyłany do przeglądarki.

Istnieją jednak pewne wady trwałości stanu składnika w pamięci, o których należy pamiętać:

  • Jeśli serwer zostanie uruchomiony ponownie między żądaniem, stan zostanie utracony.
  • Rozwiązanie równoważenia obciążenia serwera internetowego aplikacji musi zawierać sesje sticky, aby upewnić się, że wszystkie żądania z tej samej przeglądarki powrócą do tego samego serwera. Jeśli żądanie przejdzie do innego serwera, stan zostanie utracony.
  • Trwałość stanu składnika na serwerze może prowadzić do ciśnienia pamięci na serwerze internetowym.

Z powyższych powodów nie należy polegać tylko na stanie składnika, który ma znajdować się w pamięci na serwerze. Aplikacja powinna również zawierać magazyn danych zapasowych dla danych między żądaniami. Kilka prostych przykładów tej strategii:

  • W aplikacji koszyka na zakupy utrwali zawartość nowych elementów dodanych do koszyka w rekordzie bazy danych. Jeśli stan na serwerze zostanie utracony, można go ponownie rozpoznać z rekordów bazy danych.
  • W formularzu wieloczęściowym użytkownicy będą oczekiwać, że aplikacja będzie pamiętać wartości między poszczególnymi żądaniami. Zapisz dane między poszczególnymi wpisami użytkownika w magazynie danych, aby można je było pobrać i zebrać w ostateczną strukturę odpowiedzi formularza po zakończeniu formularza wieloczęściowego.

Aby uzyskać dodatkowe informacje na temat zarządzania stanem w aplikacjach platformy Blazor, zobacz ASP.NET zarządzanie stanem platformy Blazor.

Utrzymywanie stanu za pomocą sesji

Deweloperzy formularzy internetowych mogą przechowywać informacje o aktualnie działającym użytkowniku z obiektem słownika Microsoft.AspNetCore.Http.ISession . Wystarczy dodać obiekt z kluczem ciągu do Sessionobiektu , a ten obiekt będzie dostępny w późniejszym czasie podczas interakcji użytkownika z aplikacją. W celu wyeliminowania zarządzania interakcją z protokołem HTTP Session obiekt ułatwił konserwację stanu.

Podpis obiektu .NET Framework Session nie jest taki sam jak obiekt ASP.NET Core Session . Przed podjęciem decyzji o migracji i użyciu nowej funkcji stanu sesji sesji należy wziąć pod uwagę dokumentację nowej sesji ASP.NET Core Session.

Sesja jest dostępna w ASP.NET Core i Blazor Server, ale nie zaleca się używania ich na rzecz odpowiedniego przechowywania danych w repozytorium danych. Stan sesji nie działa również, jeśli odwiedzający odrzucają używanie plików cookie HTTP w aplikacji ze względu na obawy dotyczące prywatności.

Konfiguracja stanu ASP.NET Core i Sesja jest dostępna w artykule Zarządzanie sesją i stanem w ASP.NET Core.

Stan aplikacji

Obiekt Application w strukturze Web Forms udostępnia ogromne repozytorium obejmujące wiele żądań na potrzeby interakcji z konfiguracją i stanem zakresu aplikacji. Stan aplikacji to idealne miejsce do przechowywania różnych właściwości konfiguracji aplikacji, które będą odwoływały się do wszystkich żądań, niezależnie od użytkownika wysyłającego żądanie. Problem z obiektem Application dotyczył tego, że dane nie były utrwalane na wielu serwerach. Stan obiektu aplikacji został utracony między ponownymi uruchomieniami.

Podobnie jak w przypadku Sessionprogramu, zaleca się przeniesienie danych do trwałego magazynu kopii zapasowych, do którego można uzyskać dostęp przez wiele wystąpień serwera. Jeśli istnieją nietrwałe dane, do których chcesz mieć dostęp między żądaniami i użytkownikami, możesz łatwo przechowywać je w pojedynczej usłudze, która może zostać wstrzyknięta do składników, które wymagają tych informacji lub interakcji.

Konstrukcja obiektu do utrzymania stanu aplikacji i jego zużycia może przypominać następującą implementację:

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>

Obiekt MyApplicationState jest tworzony tylko raz na serwerze, a wartość VisitorCounter jest pobierana i wyjściowa w etykiecie składnika. Wartość VisitorCounter powinna być utrwalana i pobierana z magazynu danych zaplecza w celu zapewnienia trwałości i skalowalności.

W przeglądarce

Dane aplikacji mogą być również przechowywane po stronie klienta na urządzeniu użytkownika, dzięki czemu będą dostępne później. Istnieją dwie funkcje przeglądarki, które umożliwiają trwałość danych w różnych zakresach przeglądarki użytkownika:

  • localStorage — w zakresie całej przeglądarki użytkownika. Jeśli strona zostanie ponownie załadowana, przeglądarka zostanie zamknięta i ponownie otwarta lub zostanie otwarta inna karta z tym samym adresem URL, to ta sama localStorage jest udostępniana przez przeglądarkę
  • sessionStorage — w zakresie bieżącej karty przeglądarki użytkownika. Jeśli karta zostanie ponownie załadowana, stan będzie się powtarzać. Jeśli jednak użytkownik otworzy inną kartę aplikacji lub zamknie ją i otworzy ponownie przeglądarkę, stan zostanie utracony.

Możesz napisać niestandardowy kod JavaScript w celu interakcji z tymi funkcjami lub istnieje wiele pakietów NuGet, których można użyć, aby zapewnić tę funkcję. Jednym z takich pakietów jest Microsoft.AspNetCore.ProtectedBrowserStorage.

Aby uzyskać instrukcje dotyczące korzystania z tego pakietu do interakcji z usługami localStorage i sessionStorage, zobacz artykuł Blazor State Management .