Delen via


IHttpContextAccessor / HttpContext in ASP.NET Core Blazor-toepassingen

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.

IHttpContextAccessor over het algemeen moet worden vermeden met interactieve rendering, omdat een geldige HttpContext niet altijd beschikbaar is.

IHttpContextAccessor kan worden gebruikt tijdens het weergeven van statische serverzijde (statische SSR), bijvoorbeeld in statisch gerenderde hoofdonderdelen en wanneer u een tokenhandler gebruikt voor web-API-aanroepen op de server. Het is raadzaam om IHttpContextAccessor te vermijden wanneer statische SSR of de uitvoering van code op de server niet kan worden gegarandeerd.

HttpContext kan alleen worden gebruikt als trapsgewijze parameter in statisch gerenderde hoofdonderdelen of tijdens statische SSR voor algemene taken, zoals het inspecteren en wijzigen van headers of andere eigenschappen in het App onderdeel (App.razor). De waarde is null tijdens interactieve rendering.

[CascadingParameter]
public HttpContext? HttpContext { get; set; }

Voor aanvullende context in geavanceerde randgevallen†, zie de discussie in de volgende artikelen:

† De meeste ontwikkelaars die apps bouwen en onderhouden Blazor , hoeven zich niet te verdiepen in geavanceerde concepten wanneer de algemene richtlijnen in dit artikel worden gevolgd. Het belangrijkste concept waarmee u rekening moet houden, is dat HttpContext het in wezen een servergebaseerde, aanvraag-antwoordfunctie is die alleen algemeen beschikbaar is op de server tijdens statische SSR en alleen is gemaakt wanneer het circuit van een gebruiker tot stand is gebracht.

Kopteksten niet instellen of wijzigen nadat het antwoord is gestart

Als u een header probeert in te stellen of te wijzigen na de eerste rendering (nadat het antwoord is gestart), treedt er een fout op:

System.InvalidOperationException: 'Headers are read-only, response has already started.'

Voorbeelden van situaties die tot deze fout leiden, zijn:

  • Het oproepen van SignInManager<TUser>.PasswordSignInAsync, dat verantwoordelijk is voor het instellen van headers zodat Identity correct werkt, terwijl streaming-rendering wordt toegepast.
  • Er wordt geprobeerd een header in te stellen of te wijzigen nadat het antwoord is gestart tijdens interactieve rendering.

Zie ASP.NET Core-opstartproces Blazorvoor hulp bij het instellen van headers voordat het antwoord wordt gestart.

Gebruik IHttpContextAccessor/HttpContext niet direct of indirect in de Razor onderdelen van Blazor-apps aan de serverzijde. Blazor apps worden uitgevoerd buiten de context van de ASP.NET Core-pijplijn. De HttpContext is niet gegarandeerd beschikbaar in de IHttpContextAccessor, en het is niet gegarandeerd dat HttpContext de context behoudt waarmee de Blazor-app is gestart.

De aanbevolen methode voor het doorgeven van de status van de aanvraag aan de Blazor-app is via de parameters van het hoofdonderdeel tijdens de eerste rendering van de app. De app kan de gegevens ook kopiëren in een scoped service tijdens de initialisatielevenscyclusgebeurtenis van het hoofdonderdeel voor gebruik in de gehele app. Zie ASP.NET Core server en Blazor Web App aanvullende beveiligingsscenario's voor meer informatie.

Een essentieel aspect van de beveiliging aan de serverzijde Blazor is dat de gebruiker die aan een bepaald circuit is gekoppeld, op een bepaald moment kan worden bijgewerkt nadat het Blazor circuit tot stand is gebracht, maar het IHttpContextAccessorwordt niet bijgewerkt. Zie ASP.NET Core-server en Blazor Web App aanvullende beveiligingsscenario's voor meer informatie over het aanpakken van deze situatie met aangepaste services.

Raadpleeg IHttpContextAccessor voor hulp bij HttpContext en SignalR in ASP.NET Core SignalR.