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.
Opmerking
Dit is niet de nieuwste versie van dit artikel. Zie de .NET 10-versie van dit artikel voor de huidige release.
Waarschuwing
Deze versie van ASP.NET Core wordt niet meer ondersteund. Zie het .NET- en .NET Core-ondersteuningsbeleid voor meer informatie. Zie de .NET 10-versie van dit artikel voor de huidige release.
Alle HttpContext informatie over een afzonderlijke HTTP-aanvraag en -reactie wordt ingekapseld. Een HttpContext exemplaar wordt geïnitialiseerd wanneer een HTTP-aanvraag wordt ontvangen. Het HttpContext exemplaar is toegankelijk via middleware en app-frameworks, zoals Web API-controllers, Razor Pagina's, SignalRgRPC en meer.
Zie HttpContext voor informatie over het gebruik van met een HTTP-aanvraag en -antwoord.
HttpContext openen vanuit Razor pagina's
Met de Razor pagina's PageModel wordt de HttpContext eigenschap toegankelijk gemaakt:
public class IndexModel : PageModel
{
public void OnGet()
{
var message = HttpContext.Request.PathBase;
// ...
}
}
U kunt dezelfde eigenschap gebruiken in de bijbehorende Razor paginaweergave:
@page
@model IndexModel
@{
var message = HttpContext.Request.PathBase;
// ...
}
HttpContext openen vanuit een Razor weergave in MVC
Razor weergaven in het MVC-patroon maken HttpContext zichtbaar via de Context eigenschap in de weergave. In het volgende voorbeeld wordt de huidige gebruikersnaam in een intranet-app opgehaald met behulp van Windows-verificatie:
@{
var username = Context.User.Identity.Name;
// ...
}
HttpContext openen vanaf een controller
Controllers maken de HttpContext eigenschap beschikbaar:
public class HomeController : Controller
{
public IActionResult About()
{
var pathBase = HttpContext.Request.PathBase;
// ...
return View();
}
}
HttpContext openen vanuit minimale API's
Volg deze stappen om HttpContext te gebruiken vanuit Minimal APIs:
app.MapGet("/", (HttpContext context) => context.Response.WriteAsync("Hello World"));
HttpContext openen vanuit middleware
Als u wilt gebruiken HttpContext vanuit aangepaste middlewareonderdelen, geeft u de HttpContext parameter door aan de Invoke of InvokeAsync methode:
public class MyCustomMiddleware
{
// ...
public async Task InvokeAsync(HttpContext context)
{
// ...
}
}
HttpContext openen vanuit SignalR
Om HttpContext vanuit SignalR te gebruiken, roept u GetHttpContext aan op Context:.
public class MyHub : Hub
{
public async Task SendMessage()
{
var httpContext = Context.GetHttpContext();
// ...
}
}
HttpContext openen vanuit gRPC-methoden
Om HttpContext vanuit gRPC-methoden te gebruiken, zie HttpContext oplossen in gRPC-methoden.
HttpContext openen vanuit aangepaste onderdelen
Voor andere framework- en aangepaste onderdelen waarvoor toegang vereist is tot HttpContext, is de aanbevolen methode om een afhankelijkheid te registreren met behulp van de ingebouwde afhankelijkheidsinjectiecontainer (DI). De DI-container levert de IHttpContextAccessor aan klassen die deze declareren als een afhankelijkheid in hun constructors:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
builder.Services.AddHttpContextAccessor();
builder.Services.AddTransient<IUserRepository, UserRepository>();
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddHttpContextAccessor();
services.AddTransient<IUserRepository, UserRepository>();
}
In het volgende voorbeeld:
- De
UserRepositoryinstantie declareert de afhankelijkheid ervanIHttpContextAccessor. - De afhankelijkheid wordt gespecificeerd wanneer DI de afhankelijkheidsketen doorloopt en een exemplaar van
UserRepositorycreëert.
public class UserRepository : IUserRepository
{
private readonly IHttpContextAccessor _httpContextAccessor;
public UserRepository(IHttpContextAccessor httpContextAccessor) =>
_httpContextAccessor = httpContextAccessor;
public void LogCurrentUser()
{
var username = _httpContextAccessor.HttpContext.User.Identity.Name;
// ...
}
}
public class UserRepository : IUserRepository
{
private readonly IHttpContextAccessor _httpContextAccessor;
public UserRepository(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public void LogCurrentUser()
{
var username = _httpContextAccessor.HttpContext.User.Identity.Name;
service.LogAccessRequest(username);
}
}
HttpContext openen vanuit een achtergrondthread
HttpContext is niet draadveilig. Het lezen of schrijven van eigenschappen van de HttpContext buiten het verwerken van een verzoek kan een NullReferenceException fout veroorzaken.
Opmerking
Als uw app sporadische NullReferenceException fouten genereert, controleert u delen van de code die de achtergrondverwerking of code start die doorgaat met verwerken nadat een aanvraag is voltooid. Zoek naar fouten, zoals het definiëren van een controllermethode als async void.
Achtergrondwerk veilig uitvoeren met HttpContext gegevens:
- Kopieer de vereiste gegevens tijdens de verwerking van de aanvraag.
- Geef de gekopieerde gegevens door aan een achtergrondtaak.
-
Verwijs niet naar
HttpContextgegevens in parallelle taken. Pak de benodigde gegevens uit de context uit voordat u de parallelle taken start.
Om onveilige code te voorkomen, moet u nooit HttpContext doorgeven aan een methode die achtergrondtaken uitvoert. Geef in plaats daarvan de vereiste gegevens door.
In het volgende voorbeeld roept de SendEmail methode de SendEmailCoreAsync methode aan om een e-mailbericht te verzenden. De waarde van de X-Correlation-Id header wordt doorgegeven aan SendEmailCoreAsync in plaats van de HttpContext. Code-uitvoering wacht niet totdat SendEmailCoreAsync voltooid is
public class EmailController : Controller
{
public IActionResult SendEmail(string email)
{
var correlationId = HttpContext.Request.Headers["X-Correlation-Id"].ToString();
_ = SendEmailCoreAsync(correlationId);
return View();
}
private async Task SendEmailCoreAsync(string correlationId)
{
// ...
}
}
In het volgende voorbeeld wordt de SendEmailCore methode aangeroepen om een e-mailbericht te verzenden. De correlationId parameter wordt doorgegeven aan SendEmailCore, niet aan de HttpContext. Code-uitvoering wacht niet totdat SendEmailCore voltooid is
public class EmailController : Controller
{
public IActionResult SendEmail(string email)
{
var correlationId = HttpContext.Request.Headers["x-correlation-id"].ToString();
_ = SendEmailCore(correlationId);
return View();
}
private async Task SendEmailCore(string correlationId)
{
// ...
}
}
Toegang verkrijgen tot IHttpContextAccessor of HttpContext in Razor componenten (Blazor)
Als u de IHttpContextAccessor of HttpContext in Razor onderdelen (Blazor-apps) wilt openen, raadpleegt u IHttpContextAccessor/HttpContext in ASP.NET Core Blazor-apps.