Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Hinweis
Dies ist nicht die neueste Version dieses Artikels. Die aktuelle Version finden Sie in der .NET 10-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 10-Version dieses Artikels.
Die HttpContext Kapselt alle 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 Use HttpContext in ASP.NET Core.
Zugriff auf HttpContext von Razor Seiten
Das Element Razor Pages PageModel stellt die HttpContext-Eigenschaft bereit:
public class IndexModel : PageModel
{
public void OnGet()
{
var message = HttpContext.Request.PathBase;
// ...
}
}
Sie können dieselbe Eigenschaft in der entsprechenden Razor Seitenansicht verwenden:
@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 Context-Eigenschaft in der Ansicht verfügbar. Im folgenden Beispiel wird der aktuelle Benutzername in einer Intranet-App mithilfe Windows Authentifizierung abgerufen:
@{
var username = Context.User.Identity.Name;
// ...
}
Zugreifen auf HttpContext von einem Controller
Controller machen die HttpContext-Eigenschaft verfügbar:
public class HomeController : Controller
{
public IActionResult About()
{
var pathBase = HttpContext.Request.PathBase;
// ...
return View();
}
}
Zugreifen auf HttpContext von minimalen APIs
So verwenden Sie HttpContext von Minimal APIs:
app.MapGet("/", (HttpContext context) => context.Response.WriteAsync("Hello World"));
Zugriff auf HttpContext über Middleware
Um HttpContext von benutzerdefinierten Middleware-Komponenten zu verwenden, übergeben Sie den HttpContext Parameter an die Invoke oder InvokeAsync Methode:
public class MyCustomMiddleware
{
// ...
public async Task InvokeAsync(HttpContext context)
{
// ...
}
}
Zugreifen auf HttpContext von SignalR
Um HttpContext aus SignalR zu verwenden, rufen Sie die Methode GetHttpContext im Context auf:
public class MyHub : Hub
{
public async Task SendMessage()
{
var httpContext = Context.GetHttpContext();
// ...
}
}
Zugriff auf HttpContext von gRPC-Methoden
Informationen zur Verwendung HttpContext von gRPC-Methoden finden Sie unter Resolve HttpContext in gRPC-Methoden.
Zugreifen auf HttpContext aus benutzerdefinierten Komponenten
Bei anderen Framework- und benutzerdefinierten Komponenten, die Zugriff auf HttpContext erfordern, besteht der empfohlene Ansatz darin, eine Abhängigkeit mithilfe des integrierten DI-Containers (Dependency Injection) zu registrieren. Der DI-Container stellt IHttpContextAccessor für alle Klassen bereit, die es in ihren Konstruktoren als Abhängigkeit angeben.
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>();
}
Im folgenden Beispiel:
- Die
UserRepositoryInstanz deklariert ihre Abhängigkeit vonIHttpContextAccessor. - Die Abhängigkeit wird bereitgestellt, wenn die DI die Abhängigkeitskette auflöst und eine Instanz von
UserRepositoryerstellt.
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);
}
}
Zugreifen auf HttpContext aus einem Hintergrundthread
HttpContext ist nicht threadsicher. Das Lesen oder Schreiben der Eigenschaften von HttpContext außerhalb der Bearbeitung einer Anforderung kann zu einem NullReferenceException-Fehler führen.
Hinweis
Wenn Ihre App sporadische NullReferenceException Fehler generiert, überprüfen Sie Teile des Codes, die die Hintergrundverarbeitung starten, oder Code, der die Verarbeitung nach Abschluss einer Anforderung fortsetzt. 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 nicht auf
HttpContextDaten in parallelen Vorgängen. 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 ruft die Methode SendEmail die Methode SendEmailCoreAsync auf, um eine E-Mail zu senden. 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)
{
// ...
}
}
Im folgenden Beispiel wird die Methode aufgerufen, um mit dem SendEmailCore Senden einer E-Mail zu beginnen. Der correlationId-Parameter 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)
{
// ...
}
}
Zugreifen auf IHttpContextAccessor oder HttpContext in Razor Komponenten (Blazor)
Wenn Sie auf IHttpContextAccessor oder HttpContext in den Razor-Komponenten (Blazor-Apps) zugreifen möchten, lesen Sie IHttpContextAccessor/HttpContext in ASP.NET Core Blazor Apps.