Freigeben über


Zugreifen auf HttpContext in ASP.NET Core

Hinweis

Dies ist nicht die neueste Version dieses Artikels. Die aktuelle Version finden Sie in der .NET 9-Version dieses Artikels.

Warnung

Diese Version von ASP.NET Core wird nicht mehr unterstützt. Weitere Informationen finden Sie in der .NET- und .NET Core-Supportrichtlinie. Die aktuelle Version finden Sie in der .NET 9-Version dieses Artikels.

Wichtig

Diese Informationen beziehen sich auf ein Vorabversionsprodukt, das vor der kommerziellen Freigabe möglicherweise noch wesentlichen Änderungen unterliegt. Microsoft gibt keine Garantie, weder ausdrücklich noch impliziert, hinsichtlich der hier bereitgestellten Informationen.

Die aktuelle Version finden Sie in der .NET 9-Version dieses Artikels.

HttpContext kapselt sämtliche Informationen zu einer einzelnen HTTP-Anforderung und -Antwort. Eine HttpContext-Instanz wird initialisiert, wenn eine HTTP-Anforderung empfangen wird. Auf die HttpContext-Instanz kann von Middleware und App-Frameworks wie Web-API-Controllern, Razor Pages, SignalR, gRPC und mehr zugegriffen werden.

Informationen zur Verwendung von HttpContext mit einer HTTP-Anforderung und -Antwort finden Sie unter Verwenden von HttpContext in ASP.NET Core.

Zugreifen auf HttpContext aus Razor Pages

Das Razor von PageModel Pages stellt die PageModel.HttpContext-Eigenschaft zur Verfügung:

public class IndexModel : PageModel
{
    public void OnGet()
    {
        var message = HttpContext.Request.PathBase;

        // ...
    }
}

Dieselbe Eigenschaft kann in der entsprechenden Razor-Seitenansicht verwendet werden:

@page
@model IndexModel

@{
    var message = HttpContext.Request.PathBase;

    // ...
}

Zugreifen auf HttpContext aus einer Razor-Ansicht in MVC

Razor-Ansichten im MVC-Muster machen HttpContext über die RazorPage.Context-Eigenschaft in der Ansicht verfügbar. Im folgenden Beispiel wird der aktuelle Benutzername in einer Intranet-App abgerufen, die die Windows-Authentifizierung verwendet:

@{
    var username = Context.User.Identity.Name;

    // ...
}

Zugreifen auf HttpContext aus einem Controller

Controller machen die ControllerBase.HttpContext-Eigenschaft verfügbar:

public class HomeController : Controller
{
    public IActionResult About()
    {
        var pathBase = HttpContext.Request.PathBase;

        // ...

        return View();
    }
}

Zugreifen auf HttpContext aus minimalen APIs

Um HttpContext aus minimalen APIs zu verwenden, fügen Sie den Parameter HttpContext hinzu:

app.MapGet("/", (HttpContext context) => context.Response.WriteAsync("Hello World"));

Zugreifen auf HttpContext aus Middleware

Um HttpContext aus benutzerdefinierten Middlewarekomponenten nutzen zu können, verwenden Sie den Parameter HttpContext, der an die Methode Invoke oder InvokeAsync übergeben wird:

public class MyCustomMiddleware
{
    // ...

    public async Task InvokeAsync(HttpContext context)
    {
        // ...
    }
}

Zugreifen auf HttpContext aus SignalR

Um HttpContext aus SignalR zu verwenden, rufen Sie die Methode GetHttpContext für Hub.Context auf:

public class MyHub : Hub
{
    public async Task SendMessage()
    {
        var httpContext = Context.GetHttpContext();

        // ...
    }
}

Zugreifen auf HttpContext aus gRPC-Methoden

Informationen zum Verwenden von HttpContext aus gRPC-Methoden finden Sie unter Auflösen von HttpContext in gRPC-Methoden.

Zugreifen auf HttpContext aus benutzerdefinierten Komponenten

Für andere Framework- und benutzerdefinierte Komponenten, die Zugriff auf HttpContext erfordern, wird empfohlen, eine Abhängigkeit mithilfe des integrierten Abhängigkeitsinjektionscontainers zu registrieren. Der Abhängigkeitsinjektionscontainer stellt IHttpContextAccessor allen Klassen zur Verfügung, die ihn in ihren Konstruktoren als Abhängigkeit deklarieren:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllersWithViews();
builder.Services.AddHttpContextAccessor();
builder.Services.AddTransient<IUserRepository, UserRepository>();

Im folgenden Beispiel:

  • UserRepository deklariert seine Abhängigkeit von IHttpContextAccessor.
  • Die Abhängigkeit wird bereitgestellt, wenn die Abhängigkeitsinjektion die Abhängigkeitskette auflöst und eine UserRepository-Instanz erstellt.
public class UserRepository : IUserRepository
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public UserRepository(IHttpContextAccessor httpContextAccessor) =>
        _httpContextAccessor = httpContextAccessor;

    public void LogCurrentUser()
    {
        var username = _httpContextAccessor.HttpContext.User.Identity.Name;

        // ...
    }
}

Zugreifen auf HttpContext aus einem Hintergrundthread

HttpContext ist nicht threadsicher. Eigenschaften von HttpContext außerhalb der Verarbeitung einer Anforderung zu lesen oder zu schreiben kann zu einer NullReferenceException führen.

Hinweis

Wenn Ihre App sporadische NullReferenceException-Fehler erzeugt, überprüfen Sie die Teile des Codes, die die Hintergrundverarbeitung starten oder die Verarbeitung fortsetzen, nachdem eine Anforderung erfüllt wurde. Suchen Sie nach Fehlern, wie das Definieren einer Controllermethode als async void.

So werden Hintergrundaufgaben mit HttpContext-Daten sicher ausgeführt

  • Kopieren Sie die benötigten Daten während der Verarbeitung der Anforderung.
  • Übergeben Sie die kopierten Daten an eine Hintergrundaufgabe.
  • Verweisen Sie in parallelen Aufgaben nicht auf HttpContext-Daten. Extrahieren Sie die erforderlichen Daten aus dem Kontext, bevor Sie die parallelen Aufgaben starten.

Um unsicheren Code zu vermeiden, übergeben Sie HttpContext niemals an eine Methode, die im Hintergrund arbeitet. Übergeben Sie stattdessen die erforderlichen Daten. Im folgenden Beispiel wird SendEmail von SendEmailCoreAsync aufgerufen, um mit dem Senden einer E-Mail zu beginnen. Der Wert des Headers X-Correlation-Id wird an SendEmailCoreAsync statt HttpContext übergeben. Die Codeausführung wartet nicht auf den Abschluss von SendEmailCoreAsync:

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)
    {
        // ...
    }
}

IHttpContextAccessor / HttpContext in Razor Komponenten (Blazor)

Weitere Informationen finden Sie unter IHttpContextAccessor/HttpContext in ASP.NET Core Blazor Apps.

HttpContext kapselt sämtliche Informationen zu einer einzelnen HTTP-Anforderung und -Antwort. Eine HttpContext-Instanz wird initialisiert, wenn eine HTTP-Anforderung empfangen wird. Auf die HttpContext-Instanz kann von Middleware und App-Frameworks wie Web-API-Controllern, Razor Pages, SignalR, gRPC und mehr zugegriffen werden.

Informationen zur Verwendung von HttpContext mit einer HTTP-Anforderung und -Antwort finden Sie unter Verwenden von HttpContext in ASP.NET Core.

Zugreifen auf HttpContext aus Razor Pages

Das Razor von PageModel Pages stellt die PageModel.HttpContext-Eigenschaft zur Verfügung:

public class IndexModel : PageModel
{
    public void OnGet()
    {
        var message = HttpContext.Request.PathBase;

        // ...
    }
}

Dieselbe Eigenschaft kann in der entsprechenden Razor-Seitenansicht verwendet werden:

@page
@model IndexModel

@{
    var message = HttpContext.Request.PathBase;

    // ...
}

Zugreifen auf HttpContext aus einer Razor-Ansicht in MVC

Razor-Ansichten im MVC-Muster machen HttpContext über die RazorPage.Context-Eigenschaft in der Ansicht verfügbar. Im folgenden Beispiel wird der aktuelle Benutzername in einer Intranet-App abgerufen, die die Windows-Authentifizierung verwendet:

@{
    var username = Context.User.Identity.Name;

    // ...
}

Zugreifen auf HttpContext aus einem Controller

Controller machen die ControllerBase.HttpContext-Eigenschaft verfügbar:

public class HomeController : Controller
{
    public IActionResult About()
    {
        var pathBase = HttpContext.Request.PathBase;

        // ...

        return View();
    }
}

Zugreifen auf HttpContext aus Middleware

Wenn Sie mit benutzerdefinierten Middlewarekomponenten arbeiten, wird HttpContext an die Methode Invoke oder InvokeAsync übergeben:

public class MyCustomMiddleware
{
    public Task InvokeAsync(HttpContext context)
    {
        // ...
    }
}

Zugreifen auf HttpContext aus benutzerdefinierten Komponenten

Für andere Framework- und benutzerdefinierte Komponenten, die Zugriff auf HttpContext erfordern, wird empfohlen, eine Abhängigkeit mithilfe des integrierten Abhängigkeitsinjektionscontainers zu registrieren. Der Abhängigkeitsinjektionscontainer stellt IHttpContextAccessor allen Klassen zur Verfügung, die ihn in ihren Konstruktoren als Abhängigkeit deklarieren:

public void ConfigureServices(IServiceCollection services)
{
     services.AddControllersWithViews();
     services.AddHttpContextAccessor();
     services.AddTransient<IUserRepository, UserRepository>();
}

Im folgenden Beispiel:

  • UserRepository deklariert seine Abhängigkeit von IHttpContextAccessor.
  • Die Abhängigkeit wird bereitgestellt, wenn die Abhängigkeitsinjektion die Abhängigkeitskette auflöst und eine UserRepository-Instanz erstellt.
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);
    }
}

Zugreifen auf HttpContext aus einem Hintergrundthread

HttpContext ist nicht threadsicher. Eigenschaften von HttpContext außerhalb der Verarbeitung einer Anforderung zu lesen oder zu schreiben kann zu einer NullReferenceException führen.

Hinweis

Wenn Ihre App sporadische NullReferenceException-Fehler erzeugt, überprüfen Sie die Teile des Codes, die die Hintergrundverarbeitung starten oder die Verarbeitung fortsetzen, nachdem eine Anforderung erfüllt wurde. Suchen Sie nach Fehlern, wie das Definieren einer Controllermethode als async void.

So werden Hintergrundaufgaben mit HttpContext-Daten sicher ausgeführt

  • Kopieren Sie die benötigten Daten während der Verarbeitung der Anforderung.
  • Übergeben Sie die kopierten Daten an eine Hintergrundaufgabe.
  • Verweisen Sie in parallelen Aufgaben nicht auf HttpContext-Daten. Extrahieren Sie die erforderlichen Daten aus dem Kontext, bevor Sie die parallelen Aufgaben starten.

Um unsicheren Code zu vermeiden, übergeben Sie HttpContext niemals an eine Methode, die im Hintergrund arbeitet. Übergeben Sie stattdessen die erforderlichen Daten. Im folgenden Beispiel wird SendEmailCore aufgerufen, um mit dem Senden einer E-Mail zu beginnen. correlationId wird an SendEmailCore übergeben, nicht an HttpContext. Die Codeausführung wartet nicht auf den Abschluss von SendEmailCore:

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)
    {
        // ...
    }
}

IHttpContextAccessor / HttpContext in Razor Komponenten (Blazor)

Weitere Informationen finden Sie unter IHttpContextAccessor/HttpContext in ASP.NET Core Blazor Apps.