Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Poznámka:
Toto není nejnovější verze tohoto článku. Aktuální verzi najdete ve verzi .NET 10 tohoto článku.
Výstraha
Tato verze ASP.NET Core již není podporována. Pro více informací se podívejte na Zásady podpory .NET a .NET Core. Aktuální vydání tohoto článku najdete v verzi .NET 9.
Tento článek popisuje běžné přístupy k údržbě dat (stavu) uživatele ve scénářích na straně Blazor serveru.
Udržovat stav uživatele
Server-side Blazor je stavový aplikační framework. Ve většině případů aplikace udržuje připojení k serveru. Stav uživatele se uchovává v paměti serveru v okruhu.
Mezi příklady stavu uživatele uchovávaného v okruhu patří:
- Hierarchie instancí komponent a jejich nejnovější vykreslený výstup v uživatelském rozhraní.
- Hodnoty polí a vlastností v instancích komponent.
- Data uložená v instancích služby injektáže závislostí (DI), které jsou omezené na daný okruh.
Stav uživatele také může být v proměnných JavaScriptu v paměti prohlížeče nastavených pomocí JavaScript interop volání.
Pokud uživatel dojde k dočasné ztrátě síťového připojení, Blazor pokusí se uživatele znovu připojit k původnímu okruhu s původním stavem. Opětovné připojení uživatele k původnímu okruhu v paměti serveru ale není vždy možné:
- Server nemůže trvale zachovat odpojený okruh. Server musí po vypršení časového limitu uvolnit odpojený okruh nebo když je server pod tlakem paměti.
- V prostředích nasazení s více servery s vyrovnáváním zatížení může dojít k selhání jednotlivých serverů nebo k jejich automatickému odebrání, pokud už není potřeba zpracovat celkový objem požadavků. Původní požadavky na zpracování serveru pro uživatele můžou být nedostupné, když se uživatel pokusí znovu připojit.
- Uživatel může zavřít a znovu otevřít prohlížeč nebo znovu načíst stránku, která odebere jakýkoli stav uložený v paměti prohlížeče. Například hodnoty proměnných JavaScriptu nastavené přes JavaScript interop se ztratí.
Když se uživatel nemůže znovu připojit k původnímu okruhu, uživatel obdrží nový okruh s nově inicializovaným stavem. To odpovídá zavření a opětovnému otevření desktopové aplikace.
Kdy zachovat stav uživatele
Trvalost stavu není automatická. Při vývoji aplikace musíte provést kroky pro implementaci stavové trvalosti dat.
Obecně platí, že zachovejte stav napříč okruhy, ve kterých uživatelé aktivně vytvářejí data, a ne jednoduše čtou data, která už existují.
Trvalost dat se obvykle vyžaduje jenom pro vysoce hodnotný stav, kdy uživatelé vynaložili úsilí na vytvoření. Zachování stavu šetří čas nebo pomůcky v komerčních aktivitách:
- Vícekrokové webové formuláře: Je časově náročné, když uživatel musí opět zadávat data pro několik dokončených kroků formuláře, pokud dojde ke ztrátě jejich stavu. Uživatel v tomto scénáři ztratí stav, pokud přejde mimo formulář a vrátí se později.
- Nákupní košíky: Všechny komerčně důležité součásti aplikace, které představují potenciální výnosy, je možné zachovat. Uživatel, který ztratí svůj stav, a proto může nákupní košík koupit méně produktů nebo služeb, když se později vrátí na web.
Aplikace může zachovat pouze stav aplikace. UI nelze zachovat, například instance komponent a jejich vykreslovací stromy. Komponenty a vykreslovací stromy nejsou obecně serializovatelné. Pokud chcete zachovat stav uživatelského rozhraní, například rozbalené uzly ovládacího prvku stromového zobrazení, musí aplikace použít vlastní kód k modelování chování stavu uživatelského rozhraní jako serializovatelného stavu aplikace.
Trvalost stavu okruhu
Během vykreslování Blazor Web Appna straně serveru může zachovat stav relace uživatele (okruhu), když se připojení k serveru ztratí po delší dobu nebo se proaktivně pozastaví, pokud se neaktivuje aktualizace celé stránky. Uživatelé tak můžou pokračovat ve své relaci bez ztráty neuložené práce v následujících scénářích:
- Omezování karet prohlížeče
- Uživatelé mobilních zařízení přepínají aplikace
- Přerušení sítě
- Proaktivní správa prostředků (pozastavení neaktivních okruhů)
- Vylepšená navigace
Prostředky serveru je možné uvolnit, pokud je možné zachovat stav okruhu a poté pokračovat později:
- I když je okruh odpojený, může pokračovat v provádění práce a spotřebovávat procesor, paměť a další prostředky. Trvalý stav spotřebovává jen pevnou velikost paměti, kterou řídí vývojář.
- Trvalý stav představuje podmnožinu paměti spotřebované aplikací, takže server nemusí sledovat komponenty aplikace a další objekty na straně serveru.
Stav je uchováván pro dva scénáře:
- Stav komponenty: Stav, který komponenty používají pro vykreslování interaktivního serveru, například seznam položek načtených z databáze nebo formulář, který uživatel vyplňuje.
- Služby s vymezeným oborem: Stav uložený uvnitř služby na straně serveru, například aktuální uživatel.
Podmínky:
- Tato funkce je platná pouze pro vykreslování interaktivního serveru.
- Pokud uživatel aktualizuje stránku (aplikaci), trvalý stav se ztratí.
- Stav musí být serializovatelný ve formátu JSON. Cyklické odkazy nebo entity ORM nemusí serializovat správně.
- Použijte
@keypro zajištění jedinečnosti při vykreslování komponent ve smyčce, aby se předešlo konfliktům klíčů. - Zachovejte pouze nezbytný stav. Ukládání nadměrných dat může mít vliv na výkon.
- Bez automatické hibernace. Musíte výslovně vyjádřit výslovný souhlas a nakonfigurovat trvalost stavu.
- Žádné záruky obnovení. Pokud se trvalost stavu nezdaří, aplikace se vrátí do výchozího odpojeného prostředí.
Trvalost stavu je ve výchozím nastavení povolena, když je AddInteractiveServerComponents volána na AddRazorComponents v souboru Program.
MemoryCache je výchozí implementace úložiště pro instance jedné aplikace a ukládá až 1 000 trvalých okruhů po dobu dvou hodin, které je možné konfigurovat.
Pomocí následujících možností můžete změnit výchozí hodnoty zprostředkovatele v paměti:
-
PersistedCircuitInMemoryMaxRetained (
{CIRCUIT COUNT}placeholder): Maximální počet okruhů, které mají zůstat zachovány. Výchozí hodnota je 1 000 okruhů. Například, použijte2000k zachování stavu až pro 2 000 okruhů. -
PersistedCircuitInMemoryRetentionPeriod (
{RETENTION PERIOD}zástupný symbol): Maximální doba uchování jako TimeSpan. Výchozí hodnota je dvě hodiny. Například se používáTimeSpan.FromHours(3)pro tříhodinovou dobu uchovávání.
services.Configure<CircuitOptions>(options =>
{
options.PersistedCircuitInMemoryMaxRetained = {CIRCUIT COUNT};
options.PersistedCircuitInMemoryRetentionPeriod = {RETENTION PERIOD};
});
Zachování stavu součástí napříč okruhy je postaveno na stávajícím PersistentComponentState rozhraní API, které pokračuje v zachování stavu pro předdefinované komponenty, které přecházejí do interaktivního režimu vykreslování. Další informace najdete v tématu ASP.NET Blazor trvalost stavu předsekutného jádra.
[POZNÁMKA] Zachování stavu komponenty pro předběžné vykreslování funguje pro jakýkoli interaktivní režim vykreslování, ale perzistence stavu okruhu funguje pouze pro režim vykreslování Interaktivní server.
Označte vlastnosti komponenty pomocí atributu[PersistentState] pro umožnění trvalosti stavu obvodu. Následující příklad také klíče položky s atributem@key direktivy poskytnout jedinečný identifikátor pro každou instanci komponenty:
@foreach (var item in Items)
{
<ItemDisplay @key="@($"unique-prefix-{item.Id}")" Item="item" />
}
@code {
[PersistentState]
public List<Item> Items { get; set; }
protected override async Task OnInitializedAsync()
{
Items ??= await LoadItemsAsync();
}
}
Pokud chcete zachovat stav pro služby s vymezeným oborem, anotujte vlastnosti služby pomocí atributu [PersistentState], přidejte službu do kolekce služeb a zavolejte rozšiřující metodu RegisterPersistentService pro službu:
public class CustomUserService
{
[PersistentState]
public string UserData { get; set; }
}
services.AddScoped<CustomUserService>();
services.AddRazorComponents()
.AddInteractiveServerComponents()
.RegisterPersistentService<CustomUserService>(RenderMode.InteractiveAuto);
[POZNÁMKA] Předchozí příklad zachovává
UserDatastav při použití služby v předkreslování komponent jak pro interaktivní serverové vykreslování, tak pro interaktivní WebAssembly vykreslování, protožeRenderMode.InteractiveAutoje specifikováno jako RegisterPersistentService. Trvalost stavu okruhu je však k dispozici pouze pro režim vykreslování interaktivního serveru .
Pokud chcete zpracovat trvalost distribuovaného stavu (a pracovat jako výchozí mechanismus trvalosti stavu při konfiguraci), přiřaďte HybridCache aplikaci (API: HybridCache) a nakonfigurujte vlastní dobu trvalosti (PersistedCircuitDistributedRetentionPeriodve výchozím nastavení osm hodin).
HybridCache se používá, protože poskytuje jednotný přístup k distribuovanému úložišti, který nevyžaduje samostatné balíčky pro každého zprostředkovatele úložiště.
V následujícím příkladu je implementován HybridCache s poskytovatelem úložiště Redis.
services.AddHybridCache()
.AddRedis("{CONNECTION STRING}");
services.AddRazorComponents()
.AddInteractiveServerComponents();
V předchozím příkladu {CONNECTION STRING} představuje zástupný symbol pro připojovací řetězec mezipaměti Redis, který by se měl poskytnout pomocí bezpečného způsobu, jako je nástroj Secret Manager ve vývojovém prostředí nebo Azure Key Vault se spravovanými identitami Azure pro aplikace nasazené v Azure v jakémkoli prostředí.
Pozastavení a obnovení okruhů
Pozastavte a obnovte okruhy pro implementaci vlastních zásad, které zlepšují škálovatelnost aplikace.
Pozastavení okruhu ukládá podrobnosti o okruhu v úložišti prohlížeče na straně klienta a vyřadí okruh, který uvolní prostředky serveru. Obnovení okruhu vytvoří nový okruh a inicializuje ho pomocí trvalého stavu.
Z obslužné rutiny události JavaScriptu:
- Volání
Blazor.pausek pozastavení okruhu - Volání
Blazor.resumepro obnovení okruhu
Následující příklad předpokládá, že okruh není nutný pro aplikaci, která není viditelná:
window.addEventListener('visibilitychange', () => {
if (document.visibilityState === 'hidden') {
Blazor.pause();
} else if (document.visibilityState === 'visible') {
Blazor.resume();
}
});
Zachování stavu napříč okruhy
Obecně platí, že zachovejte stav napříč okruhy, ve kterých uživatelé aktivně vytvářejí data, a ne jednoduše čtou data, která už existují.
Aby se zachoval stav napříč okruhy, musí aplikace uchovávat data do jiného umístění úložiště, než je paměť serveru. Trvalost stavu není automatická. Při vývoji aplikace musíte provést kroky pro implementaci stavové trvalosti dat.
Trvalost dat se obvykle vyžaduje jenom pro vysoce hodnotný stav, kdy uživatelé vynaložili úsilí na vytvoření. V následujících příkladech zachování stavu buď šetří čas, nebo pomáhá v komerčních aktivitách.
- Vícekrokové webové formuláře: Je časově náročné, když uživatel musí opět zadávat data pro několik dokončených kroků formuláře, pokud dojde ke ztrátě jejich stavu. Uživatel v tomto scénáři ztratí stav, pokud přejde mimo formulář a vrátí se později.
- Nákupní košíky: Všechny komerčně důležité součásti aplikace, které představují potenciální výnosy, je možné zachovat. Uživatel, který ztratí svůj stav, a tedy nákupní košík, může při pozdějším návratu na web zakoupit méně produktů nebo služeb.
Aplikace může zachovat pouze stav aplikace. UI nelze zachovat, například instance komponent a jejich vykreslovací stromy. Komponenty a vykreslovací stromy nejsou obecně serializovatelné. Pokud chcete zachovat stav uživatelského rozhraní, například rozbalené uzly ovládacího prvku stromového zobrazení, musí aplikace použít vlastní kód k modelování chování stavu uživatelského rozhraní jako serializovatelného stavu aplikace.
Úložiště na straně serveru
Pro trvalost dat, která zahrnuje více uživatelů a zařízení, může aplikace používat úložiště na straně serveru. K dispozici jsou následující možnosti:
- Úložiště blobů
- Úložiště klíč-hodnota
- Relační databáze
- Úložiště tabulek
Po uložení dat se stav uživatele zachová a zpřístupní v jakémkoli novém okruhu.
Další informace o možnostech úložiště dat Azure najdete v následujících tématech:
Úložiště prohlížeče
Další informace najdete v tématu ASP.NET Správa stavu jádra Blazor pomocí chráněného úložiště prohlížeče.