Tillståndshantering
Dricks
Det här innehållet är ett utdrag ur eBook, Blazor for ASP NET Web Forms Developers for Azure, tillgängligt på .NET Docs eller som en kostnadsfri nedladdningsbar PDF som kan läsas offline.
Tillståndshantering är ett nyckelbegrepp för webbformulärprogram som underlättas via funktionerna ViewState, Sessionstillstånd, Programtillstånd och Postback. Dessa tillståndskänsliga funktioner i ramverket hjälpte till att dölja den tillståndshantering som krävs för ett program och göra det möjligt för programutvecklare att fokusera på att leverera sina funktioner. Med ASP.NET Core och Blazor har vissa av dessa funktioner flyttats och vissa har tagits bort helt och hållet. Det här kapitlet beskriver hur du underhåller tillstånd och levererar samma funktioner med de nya funktionerna i Blazor.
Begära tillståndshantering med ViewState
När du diskuterar tillståndshantering i webbformulärprogrammet kommer många utvecklare omedelbart att tänka på ViewState. I Webbformulär hanterar ViewState innehållets tillstånd mellan HTTP-begäranden genom att skicka ett stort kodat textblock fram och tillbaka till webbläsaren. Fältet ViewState kan vara överbelastat med innehåll från en sida som innehåller många element, vilket kan utökas till flera megabyte i storlek.
Med Blazor Server upprätthåller appen en pågående anslutning till servern. Appens tillstånd, som kallas en krets, lagras i serverminnet medan anslutningen anses vara aktiv. Tillståndet tas bara bort när användaren navigerar bort från appen eller en viss sida i appen. Alla medlemmar i de aktiva komponenterna är tillgängliga mellan interaktioner med servern.
Det finns flera fördelar med den här funktionen:
- Komponenttillståndet är lättillgängligt och återskapas inte mellan interaktioner.
- Tillståndet överförs inte till webbläsaren.
Det finns dock vissa nackdelar med minnesintern komponenttillståndspersistens att vara medveten om:
- Om servern startas om mellan begäran förloras tillståndet.
- Din lösning för belastningsutjämning av programwebbservern måste innehålla klibbiga sessioner för att säkerställa att alla begäranden från samma webbläsare återgår till samma server. Om en begäran skickas till en annan server går tillståndet förlorat.
- Beständighet för komponenttillstånd på servern kan leda till minnesbelastning på webbservern.
Av ovanstående skäl ska du inte bara förlita dig på att komponentens tillstånd ska finnas i minnet på servern. Ditt program bör också innehålla vissa säkerhetskopieringsdatalager för data mellan begäranden. Några enkla exempel på den här strategin:
- Spara innehållet i nya objekt som läggs till i kundvagnen i en databaspost i ett kundvagnsprogram. Om tillståndet på servern går förlorat kan du återskapa det från databasposterna.
- I ett webbformulär i flera delar förväntar sig användarna att programmet kommer ihåg värden mellan varje begäran. Skriv data mellan var och en av användarens inlägg i ett datalager så att de kan hämtas och monteras i den slutliga formulärsvarsstrukturen när formuläret i flera delar har slutförts.
Mer information om hur du hanterar tillstånd i Blazor-appar finns i ASP.NET Core Blazor-tillståndshantering.
Underhålla tillstånd med session
Webbformulärsutvecklare kan lagra information om den användare som för närvarande agerar med Microsoft.AspNetCore.Http.ISession ordlisteobjektet. Det är enkelt att lägga till ett objekt med en strängnyckel i Session
, och det objektet skulle vara tillgängligt vid ett senare tillfälle under användarens interaktioner med programmet. I ett försök att eliminera hanteringen av interaktion med HTTP Session
gjorde objektet det enkelt att underhålla tillståndet.
Signaturen för .NET Framework-objektet Session
är inte samma som ASP.NET Core-objektet Session
. Överväg dokumentationen för den nya ASP.NET Core-sessionen innan du bestämmer dig för att migrera och använda den nya funktionen för sessionstillstånd.
Sessionen är tillgänglig i ASP.NET Core och Blazor Server, men avråder från att använda till förmån för att lagra data på en datalagringsplats på lämpligt sätt. Sessionstillståndet fungerar inte heller om besökare nekar användningen av HTTP-cookies i ditt program på grund av sekretessproblem.
Konfiguration för ASP.NET Core- och Sessionstillstånd finns i artikeln Sessions- och tillståndshantering i ASP.NET Core.
Programtillstånd
Objektet Application
i Web Forms-ramverket tillhandahåller en massiv lagringsplats för flera begäranden för att interagera med programomfattningskonfiguration och -tillstånd. Programtillståndet var en idealisk plats för att lagra olika egenskaper för programkonfiguration som skulle refereras av alla begäranden, oavsett vilken användare som gjorde begäran. Problemet med Application
objektet var att data inte fanns kvar på flera servrar. Tillståndet för programobjektet gick förlorat mellan omstarterna.
Precis som med Session
rekommenderar vi att data flyttas till ett beständigt lagringslager som kan nås av flera serverinstanser. Om det finns flyktiga data som du vill kunna komma åt mellan begäranden och användare kan du enkelt lagra dem i en singleton-tjänst som kan matas in i komponenter som kräver den här informationen eller interaktionen.
Konstruktionen av ett objekt för att upprätthålla programtillståndet och dess förbrukning kan likna följande implementering:
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>
Objektet MyApplicationState
skapas bara en gång på servern och värdet VisitorCounter
hämtas och matas ut i komponentens etikett. Värdet VisitorCounter
ska bevaras och hämtas från ett datalager för säkerhetskopiering för hållbarhet och skalbarhet.
I webbläsaren
Programdata kan också lagras på klientsidan på användarens enhet så att de blir tillgängliga senare. Det finns två webbläsarfunktioner som möjliggör beständighet av data i olika omfång i användarens webbläsare:
localStorage
– begränsad till användarens hela webbläsare. Om sidan läses in igen stängs webbläsaren och öppnas igen, eller så öppnas en annan flik med samma URL, och sammalocalStorage
anges av webbläsarensessionStorage
– begränsad till användarens aktuella webbläsarflik. Om fliken läses in igen kvarstår tillståndet. Men om användaren öppnar en annan flik i ditt program eller stänger och öppnar webbläsaren igen går tillståndet förlorat.
Du kan skriva lite anpassad JavaScript-kod för att interagera med dessa funktioner, eller så finns det ett antal NuGet-paket som du kan använda som tillhandahåller den här funktionen. Ett sådant paket är Microsoft.AspNetCore.ProtectedBrowserStorage.
Anvisningar om hur du använder det här paketet för att interagera med localStorage
och finns i artikeln Blazor State ManagementsessionStorage
.