Sdílet prostřednictvím


Správa stavu

Tip

Tento obsah je výňatek z elektronické knihy Blazor pro vývojáře webových formulářů ASP NET pro Azure, který je k dispozici na webu .NET Docs nebo jako bezplatný soubor PDF ke stažení, který si můžete přečíst offline.

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

Správa stavu je klíčovým konceptem aplikací Webových formulářů, které jsou zajišťované funkcemi ViewState, Session State, Application State a Postback. Tyto stavové funkce architektury pomohly skrýt správu stavu vyžadovanou pro aplikaci a umožnit vývojářům aplikací zaměřit se na poskytování jejich funkcí. S ASP.NET Core a Blazorem byly některé z těchto funkcí přesunuty a některé byly zcela odstraněny. Tato kapitola popisuje, jak udržovat stav a poskytovat stejné funkce s novými funkcemi v Blazoru.

Správa stavu požadavku pomocí ViewState

Při diskusi o správě stavu v aplikaci Webové formuláře, mnoho vývojářů okamžitě pomyslí na ViewState. Ve webových formulářích spravuje ViewState stav obsahu mezi požadavky HTTP odesláním velkého zakódovaného bloku textu zpět a zpět do prohlížeče. Pole ViewState může být zahlceno obsahem ze stránky obsahující mnoho prvků a potenciálně se může zvětšit na několik megabajtů.

S Blazor Serverem udržuje aplikace trvalé připojení k serveru. Stav aplikace označovaný jako okruh se uchovává v paměti serveru, zatímco připojení je považováno za aktivní. Stav se odstraní, jenom když uživatel přejde mimo aplikaci nebo na konkrétní stránku aplikace. Mezi interakcemi se serverem jsou k dispozici všichni členové aktivních komponent.

Tato funkce má několik výhod:

  • Stav komponenty je snadno dostupný a není znovu sestaven mezi interakcemi.
  • Stav se nepřenáší do prohlížeče.

Existují však určité nevýhody trvalosti komponent v paměti, o nichž je potřeba vědět:

  • Pokud se server mezi požadavkem restartuje, stav se ztratí.
  • Řešení vyrovnávání zatížení webového aplikačního serveru musí obsahovat rychlé relace, aby se všechny požadavky ze stejného prohlížeče vrátily na stejný server. Pokud požadavek přejde na jiný server, stav se ztratí.
  • Trvalost stavu komponenty na serveru může vést k zatížení paměti na webovém serveru.

Z předchozích důvodů nespoléhejte pouze na stav komponenty, který se nachází v paměti na serveru. Vaše aplikace by také měla obsahovat určité záložní úložiště dat pro data mezi požadavky. Několik jednoduchých příkladů této strategie:

  • V aplikaci nákupního košíku zachovejte obsah nových položek přidaných do košíku v záznamu databáze. Pokud dojde ke ztrátě stavu na serveru, můžete ho rekonstituovat ze záznamů databáze.
  • Ve webovém formuláři s více částmi budou vaši uživatelé očekávat, že vaše aplikace bude pamatovat hodnoty mezi jednotlivými požadavky. Zapište data mezi příspěvky každého uživatele do úložiště dat, aby je bylo možné načíst a sestavit do konečné struktury odpovědi formuláře po dokončení vícedílného formuláře.

Další podrobnosti o správě stavu v aplikacích Blazor najdete v tématu ASP.NET správa stavu Core Blazor.

Udržovat stav pomocí relace

Vývojáři webových formulářů můžou udržovat informace o aktuálně fungujícím uživateli s objektem slovníku Microsoft.AspNetCore.Http.ISession . Je snadné přidat objekt s řetězcovým klíčem k objektu Sessiona tento objekt by byl k dispozici později během interakcí uživatele s aplikací. Při pokusu o odstranění správy interakce s protokolem HTTP Session objekt usnadňuje údržbu stavu.

Podpis objektu rozhraní .NET Framework Session není stejný jako objekt ASP.NET Core Session . Než se rozhodnete migrovat a používat novou funkci stavu relace, zvažte dokumentaci k nové ASP.NET základní relaci .

Relace je dostupná v ASP.NET Core a Blazor Serveru, ale nedoporučuje se používat ve prospěch vhodného ukládání dat do úložiště dat. Stav relace také není funkční, pokud návštěvníci odmítne používání souborů cookie HTTP ve vaší aplikaci kvůli obavám o ochranu osobních údajů.

Konfigurace pro ASP.NET Core a Stav relace je dostupná v článku o správě relací a stavů v článku ASP.NET Core.

Stav aplikace

Objekt Application v architektuře webových formulářů poskytuje masivní úložiště křížových požadavků pro interakci s konfigurací a stavem oboru aplikace. Stav aplikace byl ideálním místem pro ukládání různých vlastností konfigurace aplikace, na které by odkazovaly všechny požadavky bez ohledu na uživatele, který požadavek provádí. Problém s objektem Application byl, že data se neuchovávala na více serverech. Mezi restartováními došlo ke ztrátě stavu objektu aplikace.

Stejně jako v případě Sessiondoporučujeme, aby se data přesunula do trvalého záložního úložiště, ke kterému by mohlo přistupovat více instancí serveru. Pokud existují nestálé data, ke kterým chcete mít přístup mezi požadavky a uživateli, můžete je snadno uložit do jedné služby, která se dá vložit do komponent, které vyžadují tyto informace nebo interakci.

Konstrukce objektu pro zachování stavu aplikace a její spotřeby by mohla vypadat podobně jako následující implementace:

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>

Objekt MyApplicationState se vytvoří pouze jednou na serveru a hodnota VisitorCounter se načte a výstup v popisku komponenty. Hodnota VisitorCounter by měla být trvalá a načtená z záložního úložiště dat, aby se zachovala stálost a škálovatelnost.

V prohlížeči

Data aplikací se také dají uložit na straně klienta na zařízení uživatele, aby byla k dispozici později. Existují dvě funkce prohlížeče, které umožňují trvalost dat v různých oborech prohlížeče uživatele:

  • localStorage - vymezený na celý prohlížeč uživatele. Pokud se stránka znovu načte, prohlížeč se zavře a znovu otevře nebo se otevře jiná karta se stejnou adresou URL, prohlížeč ji poskytne stejně localStorage .
  • sessionStorage – vymezený na aktuální kartu prohlížeče uživatele. Pokud se karta znovu načte, stav se zachová. Pokud ale uživatel otevře pro vaši aplikaci jinou kartu nebo ji zavře a znovu otevře prohlížeč, stav se ztratí.

Můžete napsat nějaký vlastní javascriptový kód pro interakci s těmito funkcemi nebo existuje řada balíčků NuGet, které můžete použít, které tuto funkci poskytují. Jedním z takových balíčků je Microsoft.AspNetCore.ProtectedBrowserStorage.

Pokyny k použití tohoto balíčku pro interakci localStorage a sessionStoragenaleznete v článku Blazor State Management .