Toegang tot HttpContext in ASP.NET Core

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 UserRepository instantie declareert de afhankelijkheid ervan IHttpContextAccessor.
  • De afhankelijkheid wordt gespecificeerd wanneer DI de afhankelijkheidsketen doorloopt en een exemplaar van UserRepository creë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 HttpContext gegevens 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.