Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Notitie
Dit is niet de nieuwste versie van dit artikel. Zie de .NET 9-versie van dit artikel voor de huidige release.
Belangrijk
Deze informatie heeft betrekking op een pre-releaseproduct dat aanzienlijk kan worden gewijzigd voordat het commercieel wordt uitgebracht. Microsoft geeft geen garanties, uitdrukkelijk of impliciet, met betrekking tot de informatie die hier wordt verstrekt.
Zie de .NET 9-versie van dit artikel voor de huidige release.
In dit artikel worden scenario's voor prerendering van Razor-componenten voor server-gerenderde componenten in Blazor Web Apps uitgelegd.
Prerendering is het proces van het in eerste instantie weergeven van pagina-inhoud op de server zonder gebeurtenishandlers in te schakelen voor gerenderde besturingselementen. De server voert de HTML-gebruikersinterface van de pagina zo snel mogelijk uit als reactie op de eerste aanvraag, waardoor de app sneller reageert op gebruikers. Prerendering kan ook seo (Search Engine Optimization) verbeteren door inhoud weer te geven voor het eerste HTTP-antwoord dat zoekmachines gebruiken om de paginarang te berekenen.
Voorgeconfigureerde status behouden
Zonder dat de vooraf gegenereerde status behouden blijft, gaat de status die tijdens het prerenderen wordt gebruikt verloren en moet deze opnieuw worden gemaakt wanneer de app volledig is geladen. Als er asynchroon een status wordt gemaakt, kan de gebruikersinterface flikkeren als de vooraf gegenereerde gebruikersinterface wordt vervangen wanneer het onderdeel opnieuw wordt uitgevoerd.
Overweeg de volgende PrerenderedCounter1
tellermodule. Het component stelt een eerste willekeurige tellerwaarde in tijdens het prerenderen in de OnInitialized
levenscyclusmethode. Nadat de SignalR verbinding met de client tot stand is gebracht, wordt het onderdeel opnieuw ingesteld en wordt de initiële tellingswaarde vervangen wanneer OnInitialized
een tweede keer wordt uitgevoerd.
PrerenderedCounter1.razor
:
@page "/prerendered-counter-1"
@rendermode @(new InteractiveServerRenderMode(prerender: true))
@inject ILogger<PrerenderedCounter1> Logger
<PageTitle>Prerendered Counter 1</PageTitle>
<h1>Prerendered Counter 1</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount;
protected override void OnInitialized()
{
currentCount = Random.Shared.Next(100);
Logger.LogInformation("currentCount set to {Count}", currentCount);
}
private void IncrementCount() => currentCount++;
}
Voer de app uit en inspecteer logboekregistratie vanuit het onderdeel. Hier volgt voorbeelduitvoer.
Notitie
Als de app gebruikmaakt van interactieve routering en de pagina wordt bereikt via een interne verbeterde navigatie, gebeurt het prerendering niet. Daarom moet u een volledige pagina opnieuw laden voor het PrerenderedCounter1
-onderdeel om de volgende uitvoer te zien. Zie de sectie Interactieve routering en prerendering voor meer informatie.
info: BlazorSample.Components.Pages.PrerenderedCounter1[0]
currentCount set to 41
info: BlazorSample.Components.Pages.PrerenderedCounter1[0]
currentCount set to 92
Het eerste geregistreerde aantal wordt vastgesteld tijdens de voorweergave. Het aantal wordt opnieuw ingesteld na het vooraf renderen wanneer het component opnieuw wordt gerenderd. Er is ook een flikkering in de gebruikersinterface wanneer het aantal wordt bijgewerkt van 41 naar 92.
Als u de initiële waarde van de teller tijdens het prerenderen wilt behouden, Blazor ondersteunt het behouden van status op een vooraf gerenderde pagina met behulp van de PersistentComponentState-service (en voor componenten die zijn ingesloten in pagina's of weergaven van Razor Pages of MVC-apps, de Tag Helper voor persistente componentstatus).
Om de voorgerenderde status te behouden, gebruikt u het [SupplyParameterFromPersistentComponentState]
-kenmerk om de status in eigenschappen te behouden. Eigenschappen met dit kenmerk worden tijdens het prerenderen automatisch opgeslagen met behulp van de PersistentComponentState service. De status wordt opgehaald wanneer het onderdeel interactief wordt weergegeven of wanneer de service wordt geïnstantieerd.
Standaard worden eigenschappen geserialiseerd met behulp van de System.Text.Json serialisatiefunctie met standaardinstellingen. Serialisatie is niet veilig en vereist behoud van de gebruikte typen. Zie De trimmer configureren voor ASP.NET Core Blazorvoor meer informatie.
Het volgende telleronderdeel blijft de tellerstatus behouden tijdens het prerenderen en haalt de status op om het onderdeel te initialiseren:
- Het
[SupplyParameterFromPersistentComponentState]
kenmerk wordt toegepast op hetCounterState
type (State
). - De status van de teller wordt toegewezen wanneer
null
inOnInitialized
en automatisch hersteld wanneer het onderdeel interactief wordt gerenderd.
PrerenderedCounter2.razor
:
@page "/prerendered-counter-2"
@inject ILogger<PrerenderedCounter2> Logger
<PageTitle>Prerendered Counter 2</PageTitle>
<h1>Prerendered Counter 2</h1>
<p role="status">Current count: @State?.CurrentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
[SupplyParameterFromPersistentComponentState]
public CounterState? State { get; set; }
protected override void OnInitialized()
{
if (State is null)
{
State = new() { CurrentCount = Random.Shared.Next(100) };
Logger.LogInformation("CurrentCount set to {Count}",
State.CurrentCount);
}
else
{
Logger.LogInformation("CurrentCount restored to {Count}",
State.CurrentCount);
}
}
private void IncrementCount()
{
if (State is not null)
{
State.CurrentCount++;
}
}
public class CounterState
{
public int CurrentCount { get; set; }
}
}
Wanneer het onderdeel wordt uitgevoerd, wordt CurrentCount
slechts eenmaal ingesteld tijdens het prerenderen. De waarde wordt hersteld wanneer het onderdeel opnieuw wordt gebruikt. Hier volgt voorbeelduitvoer.
Notitie
Als de app gebruikmaakt van interactieve routering en de pagina wordt bereikt via een interne verbeterde navigatie, gebeurt het prerendering niet. Daarom moet u een volledige pagina opnieuw laden voor het onderdeel om de volgende uitvoer te zien. Zie de sectie Interactieve routering en prerendering voor meer informatie.
info: BlazorSample.Components.Pages.PrerenderedCounter2[0]
CurrentCount set to 96
info: BlazorSample.Components.Pages.PrerenderedCounter2[0]
CurrentCount restored to 96
In het volgende voorbeeld wordt de status voor meerdere onderdelen van hetzelfde type geserialiseerd:
- Eigenschappen die zijn geannoteerd met het
[SupplyParameterFromPersistentComponentState]
kenmerk, worden geserialiseerd en gedeserialiseerd tijdens het prerendering. - Het
@key
instructiekenmerk wordt gebruikt om ervoor te zorgen dat de status correct is gekoppeld aan het onderdeelexemplaar. - De
Element
eigenschap wordt geïnitialiseerd in deOnInitialized
levenscyclusmethode om null-verwijzingsonderzonderingen te voorkomen, net zoals null-verwijzingen worden vermeden voor queryparameters en formuliergegevens.
PersistentChild.razor
:
<div>
<p>Current count: @Element.CurrentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
</div>
@code {
[SupplyParameterFromPersistentComponentState]
public State Element { get; set; }
protected override void OnInitialized()
{
Element ??= new State();
}
private void IncrementCount()
{
Element.CurrentCount++;
}
private class State
{
public int CurrentCount { get; set; }
}
}
Parent.razor
:
@page "/parent"
@foreach (var element in elements)
{
<PersistentChild @key="element.Name" />
}
In het volgende voorbeeld wordt de status voor een afhankelijkheidsinjectieservice geserialiseerd:
- Eigenschappen die zijn geannoteerd met het
[SupplyParameterFromPersistentComponentState]
kenmerk, worden geserialiseerd tijdens het prerendering en gedeserialiseerd wanneer de app interactief wordt. - De RegisterPersistentService extensiemethode wordt gebruikt om de service te registreren voor persistentie. De rendermodus is vereist omdat de weergavemodus niet kan worden afgeleid van het servicetype. Gebruik een van de volgende waarden:
-
RenderMode.Server
: De service is beschikbaar voor de weergavemodus Interactive Server. -
RenderMode.Webassembly
: De service is beschikbaar voor de weergavemodus Interactive WebAssembly. -
RenderMode.InteractiveAuto
: De service is beschikbaar voor zowel de weergavemodi Interactieve Server als Interactieve Webassembly als een component in een van die modi wordt weergegeven.
-
- De service wordt opgelost tijdens de initialisatie van een interactieve rendermodus en de eigenschappen die zijn geannoteerd met het
[SupplyParameterFromPersistentComponentState]
kenmerk, worden gedeserialiseerd.
Notitie
Alleen permanente scoped services worden ondersteund.
CounterService.cs
:
public class CounterService
{
[SupplyParameterFromPersistentComponentState]
public int CurrentCount { get; set; }
public void IncrementCount()
{
CurrentCount++;
}
}
In Program.cs
:
builder.Services.RegisterPersistentService<CounterService>(
RenderMode.InteractiveAuto);
Geserialiseerde eigenschappen worden geïdentificeerd vanuit het werkelijke service-exemplaar:
- Met deze benadering kunt u een abstractie markeren als een permanente service.
- Hiermee kunnen werkelijke implementaties intern of verschillende typen zijn.
- Ondersteunt gedeelde code in verschillende assembly's.
- Resulteert in elk exemplaar dat dezelfde eigenschappen toont.
Als alternatief voor het gebruik van het declaratieve model voor persistentie met het [SupplyParameterFromPersistentComponentState]
kenmerk kunt u de PersistentComponentState service rechtstreeks gebruiken, wat meer flexibiliteit biedt voor complexe scenario's voor statuspersistentie. Roep PersistentComponentState.RegisterOnPersisting aan om een callback te registreren om de status van het onderdeel tijdens het voorrenderen te behouden. De status wordt opgehaald wanneer het onderdeel interactief wordt weergegeven. Maak de aanroep aan het einde van de initialisatiecode om tijdens het afsluiten van de app een potentiële raceconditie te voorkomen.
In het volgende voorbeeld van het tellerelement wordt de tellerstatus behouden tijdens het prerenderen en wordt de status opgehaald om het element te initialiseren.
PrerenderedCounter3.razor
:
@page "/prerendered-counter-3"
@implements IDisposable
@inject ILogger<PrerenderedCounter3> Logger
@inject PersistentComponentState ApplicationState
<PageTitle>Prerendered Counter 3</PageTitle>
<h1>Prerendered Counter 3</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount;
private PersistingComponentStateSubscription persistingSubscription;
protected override void OnInitialized()
{
if (!ApplicationState.TryTakeFromJson<int>(
nameof(currentCount), out var restoredCount))
{
currentCount = Random.Shared.Next(100);
Logger.LogInformation("currentCount set to {Count}", currentCount);
}
else
{
currentCount = restoredCount!;
Logger.LogInformation("currentCount restored to {Count}", currentCount);
}
// Call at the end to avoid a potential race condition at app shutdown
persistingSubscription = ApplicationState.RegisterOnPersisting(PersistCount);
}
private Task PersistCount()
{
ApplicationState.PersistAsJson(nameof(currentCount), currentCount);
return Task.CompletedTask;
}
private void IncrementCount() => currentCount++;
void IDisposable.Dispose() => persistingSubscription.Dispose();
}
Wanneer het onderdeel wordt uitgevoerd, wordt currentCount
slechts eenmaal ingesteld tijdens het prerenderen. De waarde wordt hersteld wanneer het onderdeel opnieuw wordt gebruikt. Hier volgt voorbeelduitvoer.
Notitie
Als de app gebruikmaakt van interactieve routering en de pagina wordt bereikt via een interne verbeterde navigatie, gebeurt het prerendering niet. Daarom moet u een volledige pagina opnieuw laden voor het onderdeel om de volgende uitvoer te zien. Zie de sectie Interactieve routering en prerendering voor meer informatie.
info: BlazorSample.Components.Pages.PrerenderedCounter3[0]
currentCount set to 96
info: BlazorSample.Components.Pages.PrerenderedCounter3[0]
currentCount restored to 96
Als u de vooraf samengestelde status wilt behouden, bepaalt u welke status moet worden behouden met behulp van de PersistentComponentState-service. PersistentComponentState.RegisterOnPersisting registreert een callback om de status van het onderdeel tijdens het voorbereiden vast te houden. De status wordt opgehaald wanneer het onderdeel interactief wordt weergegeven. Maak de aanroep aan het einde van de initialisatiecode om tijdens het afsluiten van de app een potentiële raceconditie te voorkomen.
In het volgende voorbeeld van het tellerelement wordt de tellerstatus behouden tijdens het prerenderen en wordt de status opgehaald om het element te initialiseren.
PrerenderedCounter2.razor
:
@page "/prerendered-counter-2"
@implements IDisposable
@inject ILogger<PrerenderedCounter2> Logger
@inject PersistentComponentState ApplicationState
<PageTitle>Prerendered Counter 2</PageTitle>
<h1>Prerendered Counter 2</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount;
private PersistingComponentStateSubscription persistingSubscription;
protected override void OnInitialized()
{
if (!ApplicationState.TryTakeFromJson<int>(
nameof(currentCount), out var restoredCount))
{
currentCount = Random.Shared.Next(100);
Logger.LogInformation("currentCount set to {Count}", currentCount);
}
else
{
currentCount = restoredCount!;
Logger.LogInformation("currentCount restored to {Count}", currentCount);
}
// Call at the end to avoid a potential race condition at app shutdown
persistingSubscription = ApplicationState.RegisterOnPersisting(PersistCount);
}
private Task PersistCount()
{
ApplicationState.PersistAsJson(nameof(currentCount), currentCount);
return Task.CompletedTask;
}
void IDisposable.Dispose() => persistingSubscription.Dispose();
private void IncrementCount() => currentCount++;
}
Wanneer het onderdeel wordt uitgevoerd, wordt currentCount
slechts eenmaal ingesteld tijdens het prerenderen. De waarde wordt hersteld wanneer het onderdeel opnieuw wordt gebruikt. Hier volgt voorbeelduitvoer.
Notitie
Als de app gebruikmaakt van interactieve routering en de pagina wordt bereikt via een interne verbeterde navigatie, gebeurt het prerendering niet. Daarom moet u een volledige pagina opnieuw laden voor het onderdeel om de volgende uitvoer te zien. Zie de sectie Interactieve routering en prerendering voor meer informatie.
info: BlazorSample.Components.Pages.PrerenderedCounter2[0]
currentCount set to 96
info: BlazorSample.Components.Pages.PrerenderedCounter2[0]
currentCount restored to 96
Door onderdelen te initialiseren met dezelfde status die tijdens het prerenderen wordt gebruikt, worden dure initialisatiestappen slechts één keer uitgevoerd. De gerenderde gebruikersinterface komt ook overeen met de vooraf gegenereerde gebruikersinterface, dus er treedt geen flikkering op in de browser.
De persistente vooraf gegenereerde status wordt overgebracht naar de client, waar deze wordt gebruikt om de status van het onderdeel te herstellen. Tijdens het renderen aan de clientzijde (CSR, InteractiveWebAssembly
), worden de gegevens blootgesteld aan de browser en mogen ze geen gevoelige, persoonlijke gegevens bevatten. Tijdens interactieve rendering aan de serverzijde (interactieve SSR), InteractiveServer
zorgt ASP.NET Core Data Protection ervoor dat de gegevens veilig worden overgedragen. De InteractiveAuto
weergavemodus combineert WebAssembly en Server-interactiviteit, dus het is noodzakelijk om gegevensblootstelling in de browser te overwegen, zoals in het CSR-geval.
Onderdelen die zijn ingebed in pagina's en weergaven (Razor Pagina's/MVC)
Voor onderdelen die zijn ingesloten in een pagina of weergave van een Razor Pagina's- of MVC-app, moet u de Helper voor persistente onderdeelstatustags toevoegen met de <persist-component-state />
HTML-tag in de afsluitende </body>
tag van de indeling van de app. Dit is alleen vereist voor Razor Pages- en MVC-apps. Zie Helper voor persistente statustags in ASP.NET Core voor meer informatie.
Pages/Shared/_Layout.cshtml
:
<body>
...
<persist-component-state />
</body>
Interactieve routing en prerendering
Wanneer het Routes
-onderdeel geen weergavemodus definieert, gebruikt de app interactiviteit en navigatie per pagina/onderdeel. Bij per-pagina/onderdeel navigatie wordt interne navigatie† afgehandeld door verbeterde routering nadat de app interactief is. †Internal in deze context betekent dat de URL-bestemming van de navigatie-gebeurtenis een Blazor eindpunt in de app is.
De PersistentComponentState-service werkt alleen bij het laden van de eerste pagina en niet bij interne verbeterde paginanavigatie-gebeurtenissen.
Als de app een volledige (niet-uitgebreide) navigatie naar een pagina uitvoert die gebruikmaakt van de status van een permanent onderdeel, wordt de persistente status beschikbaar gesteld voor de app die kan worden gebruikt wanneer deze interactief wordt.
Als er al een interactief circuit tot stand is gebracht en er een verbeterde navigatie wordt uitgevoerd naar een pagina die gebruikmaakt van de permanente onderdeelstatus, wordt de status niet beschikbaar gesteld in het bestaande circuit dat het onderdeel kan gebruiken. Er is geen prerendering voor het interne paginaverzoek en de PersistentComponentState-service is zich er niet van bewust dat er een verbeterde navigatie heeft plaatsgevonden. Er is geen mechanisme om statusupdates te leveren aan onderdelen die al worden uitgevoerd op een bestaand circuit. De reden hiervoor is dat Blazor alleen ondersteuning biedt voor het doorgeven van de status van de server aan de client op het moment dat de runtime wordt geïnitialiseerd, niet nadat de runtime is gestart.
Voor .NET 10 (november 2025) wordt extra werk verricht aan het Blazor framework om dit scenario aan te pakken. Zie over dotnet/aspnetcore
‡. ‡Niet-ondersteunde tijdelijke oplossingen worden niet goedgekeurd door Microsoft voor gebruik in Blazor-apps.
Gebruik pakketten, benaderingen en code van derden op eigen risico.
Verbeterde navigatie uitschakelen, waardoor de prestaties worden verminderd, maar ook het probleem van de laadstatus PersistentComponentState voor interne paginaaanvragen wordt vermeden, wordt behandeld in ASP.NET Kernroutering Blazor en -navigatie.
Richtlijnen voor prerendering
Prerenderingsrichtlijnen zijn ingedeeld in de Blazor documentatie per onderwerp. De volgende koppelingen hebben betrekking op alle prerenderingsrichtlijnen in de documentatie, gesorteerd op onderwerp.
Basisprincipes
- Overzicht: Concepten voor client- en serverweergave
- Routering
- Statische versus interactieve routing
- Routeren naar onderdelen van meerdere assembly's: Interactieve routering
wordt twee keer uitgevoerd tijdens het prerenderen: asynchrone navigatiegebeurtenissen afhandelen met
- Opstarten
- Omgevingen: de clientzijde van de omgeving lezen in een Blazor Web App
- Fouten verwerken: vooraf genereren
- SignalR
Onderdelen
-
Inhoud
<head>
beheren tijdens het voorbereiden - Rendermodi
-
Razor levenscyclusonderwerpen van componenten die betrekking hebben op prerendering
-
Initialisatie van onderdelen (
OnInitialized{Async}
) -
Na de weergave van het onderdeel (
OnAfterRender{Async}
) - Toestandsgevoelig opnieuw verbinden na prerendering
- Prerendering met JavaScript-interop: Deze sectie wordt ook weergegeven in de twee JS interop-artikelen over het aanroepen van JavaScript vanuit .NET en het aanroepen van .NET vanuit JavaScript.
- Verwerken van onvolledige asynchrone acties bij renderen: Richtlijnen voor vertraagde rendering vanwege langlopende levenscyclustaken tijdens het voorbereiden op de server.
-
Initialisatie van onderdelen (
-
QuickGrid
voorbeeld-app voor onderdelen: de QuickGrid voor Blazor voorbeeld-app wordt gehost op GitHub Pages. De site wordt snel geladen dankzij statische prerendering met behulp van het door de community onderhoudenBlazorWasmPrerendering.Build
GitHub-project. - Prerendering bij het integreren van onderdelen in Razor Pagina's en MVC-apps
-
Inhoud
Bestandsuploads: bestanden uploaden naar een server met CSR (Client Side Rendering)
Verificatie en autorisatie
- Bedreigingsbeperking aan de serverzijde: Cross-site scripting (XSS)
- Blazor Beveiligingsoverzicht aan serverzijde
-
Blazor aanvullende scenario's aan de serverzijde: tokens lezen van
HttpContext
- Blazor WebAssembly overzicht: Ondersteuning voor prerendering
- Blazor WebAssembly aanvullende scenario's
- Interactieve server-side rendering: Cross-site scripting (XSS)
Statusbeheer: Prerendering afhandelen: Naast de sectie Handle prerendering , bevatten verschillende van de andere secties van het artikel opmerkingen over prerendering.
Zie aanvullende beveiligingsscenario's voor .NET 7 of eerderBlazor WebAssembly: Voorbereiden met verificatie. Nadat u de inhoud in deze sectie hebt bekeken, stelt u de vervolgkeuzelijst versieselectie van het documentatieartikel opnieuw in op de meest recente versie van de .NET-release om ervoor te zorgen dat de documentatiepagina's tijdens volgende bezoeken worden geladen voor de meest recente versie.