Dostęp HttpContext
w ASP.NET Core
Uwaga
Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu platformy .NET 9.
Ważne
Te informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany, zanim zostanie wydany komercyjnie. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu platformy .NET 9.
HttpContext Hermetyzuje wszystkie informacje dotyczące pojedynczego żądania HTTP i odpowiedzi. Wystąpienie HttpContext
jest inicjowane po odebraniu żądania HTTP. Wystąpienie HttpContext
jest dostępne przez oprogramowanie pośredniczące i struktury aplikacji, takie jak kontrolery interfejsu API sieci Web, Razor strony, SignalR, gRPC i inne.
Aby uzyskać informacje na temat używania z HttpContext
żądaniem HTTP i odpowiedzią, zobacz Use HttpContext in ASP.NET Core (Używanie obiektu HttpContext w programie ASP.NET Core).
Dostęp HttpContext
ze Razor stron
Właściwość Razor Pages PageModel uwidacznia PageModel.HttpContext :
public class IndexModel : PageModel
{
public void OnGet()
{
var message = HttpContext.Request.PathBase;
// ...
}
}
Tej samej właściwości można używać w odpowiednim Razor widoku strony:
@page
@model IndexModel
@{
var message = HttpContext.Request.PathBase;
// ...
}
Dostęp HttpContext
z Razor widoku w mvc
Razor widoki we wzorcu MVC uwidaczniają HttpContext
właściwość za pośrednictwem RazorPage.Context właściwości w widoku. Poniższy przykład pobiera bieżącą nazwę użytkownika w aplikacji intranetowej przy użyciu uwierzytelniania systemu Windows:
@{
var username = Context.User.Identity.Name;
// ...
}
Dostęp HttpContext
z kontrolera
Kontrolery uwidaczniają ControllerBase.HttpContext właściwość:
public class HomeController : Controller
{
public IActionResult About()
{
var pathBase = HttpContext.Request.PathBase;
// ...
return View();
}
}
Dostęp HttpContext
z minimalnych interfejsów API
Aby użyć z HttpContext
minimalnych interfejsów API, dodaj HttpContext
parametr:
app.MapGet("/", (HttpContext context) => context.Response.WriteAsync("Hello World"));
Dostęp HttpContext
z oprogramowania pośredniczącego
Aby użyć z HttpContext
niestandardowych składników oprogramowania pośredniczącego, użyj parametru przekazanego HttpContext
Invoke
do metody or InvokeAsync
:
public class MyCustomMiddleware
{
// ...
public async Task InvokeAsync(HttpContext context)
{
// ...
}
}
Dostęp HttpContext
z SignalR
Aby użyć metody HttpContext
z SignalRklasy , wywołaj metodę GetHttpContext w metodzie w metodzie :Hub.Context
public class MyHub : Hub
{
public async Task SendMessage()
{
var httpContext = Context.GetHttpContext();
// ...
}
}
Dostęp HttpContext
z metod gRPC
Aby użyć z HttpContext
metod gRPC, zobacz Rozwiązywanie HttpContext
w metodach gRPC.
Dostęp HttpContext
ze składników niestandardowych
W przypadku innych struktur i składników niestandardowych, które wymagają dostępu do HttpContext
programu , zalecane jest zarejestrowanie zależności przy użyciu wbudowanego kontenera wstrzykiwania zależności (DI). Kontener DI dostarcza IHttpContextAccessor
element do wszystkich klas, które deklarują ją jako zależność w swoich konstruktorach:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
builder.Services.AddHttpContextAccessor();
builder.Services.AddTransient<IUserRepository, UserRepository>();
W poniższym przykładzie:
-
UserRepository
deklaruje zależność odIHttpContextAccessor
elementu . - Zależność jest dostarczana, gdy di rozwiązuje łańcuch zależności i tworzy wystąpienie klasy
UserRepository
.
public class UserRepository : IUserRepository
{
private readonly IHttpContextAccessor _httpContextAccessor;
public UserRepository(IHttpContextAccessor httpContextAccessor) =>
_httpContextAccessor = httpContextAccessor;
public void LogCurrentUser()
{
var username = _httpContextAccessor.HttpContext.User.Identity.Name;
// ...
}
}
HttpContext
dostęp z wątku w tle
HttpContext
nie jest bezpieczny wątkowo. Odczytywanie lub zapisywanie właściwości HttpContext
poza przetwarzaniem żądania może spowodować, że NullReferenceExceptionelement .
Uwaga
Jeśli aplikacja generuje sporadyczne NullReferenceException
błędy, przejrzyj części kodu, które rozpoczynają przetwarzanie w tle lub które kontynuują przetwarzanie po zakończeniu żądania. Poszukaj błędów, takich jak zdefiniowanie metody kontrolera jako async void
.
Aby bezpiecznie wykonywać pracę w tle z HttpContext
danymi:
- Skopiuj wymagane dane podczas przetwarzania żądań.
- Przekaż skopiowane dane do zadania w tle.
- Nie odwołuj się do
HttpContext
danych równoległych. Wyodrębnij dane potrzebne z kontekstu przed rozpoczęciem zadań równoległych.
Aby uniknąć niebezpiecznego kodu, nigdy nie należy przekazywać HttpContext
do metody, która działa w tle. Przekaż wymagane dane. W poniższym przykładzie SendEmail
wywołania SendEmailCoreAsync
w celu rozpoczęcia wysyłania wiadomości e-mail. Wartość nagłówka X-Correlation-Id
jest przekazywana SendEmailCoreAsync
zamiast .HttpContext
Wykonanie kodu nie czeka na SendEmailCoreAsync
ukończenie:
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
w Razor składnikach (Blazor)
Aby uzyskać więcej informacji, zobacz IHttpContextAccessor/HttpContext w aplikacjach ASP.NET Core Blazor.
HttpContext Hermetyzuje wszystkie informacje dotyczące pojedynczego żądania HTTP i odpowiedzi. Wystąpienie HttpContext
jest inicjowane po odebraniu żądania HTTP. Wystąpienie HttpContext
jest dostępne przez oprogramowanie pośredniczące i struktury aplikacji, takie jak kontrolery interfejsu API sieci Web, Razor strony, SignalR, gRPC i inne.
Aby uzyskać informacje na temat używania z HttpContext
żądaniem HTTP i odpowiedzią, zobacz Use HttpContext in ASP.NET Core (Używanie obiektu HttpContext w programie ASP.NET Core).
Dostęp HttpContext
ze Razor stron
Właściwość Razor Pages PageModel uwidacznia PageModel.HttpContext :
public class IndexModel : PageModel
{
public void OnGet()
{
var message = HttpContext.Request.PathBase;
// ...
}
}
Tej samej właściwości można używać w odpowiednim Razor widoku strony:
@page
@model IndexModel
@{
var message = HttpContext.Request.PathBase;
// ...
}
Dostęp HttpContext
z Razor widoku w mvc
Razor widoki we wzorcu MVC uwidaczniają HttpContext
właściwość za pośrednictwem RazorPage.Context właściwości w widoku. Poniższy przykład pobiera bieżącą nazwę użytkownika w aplikacji intranetowej przy użyciu uwierzytelniania systemu Windows:
@{
var username = Context.User.Identity.Name;
// ...
}
Dostęp HttpContext
z kontrolera
Kontrolery uwidaczniają ControllerBase.HttpContext właściwość:
public class HomeController : Controller
{
public IActionResult About()
{
var pathBase = HttpContext.Request.PathBase;
// ...
return View();
}
}
Dostęp HttpContext
z oprogramowania pośredniczącego
Podczas pracy z niestandardowymi składnikami HttpContext
oprogramowania pośredniczącego jest przekazywany do Invoke
metody lub InvokeAsync
:
public class MyCustomMiddleware
{
public Task InvokeAsync(HttpContext context)
{
// ...
}
}
Dostęp HttpContext
ze składników niestandardowych
W przypadku innych struktur i składników niestandardowych, które wymagają dostępu do HttpContext
programu , zalecane jest zarejestrowanie zależności przy użyciu wbudowanego kontenera wstrzykiwania zależności (DI). Kontener DI dostarcza IHttpContextAccessor
element do wszystkich klas, które deklarują ją jako zależność w swoich konstruktorach:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddHttpContextAccessor();
services.AddTransient<IUserRepository, UserRepository>();
}
W poniższym przykładzie:
-
UserRepository
deklaruje zależność odIHttpContextAccessor
elementu . - Zależność jest dostarczana, gdy di rozwiązuje łańcuch zależności i tworzy wystąpienie klasy
UserRepository
.
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
dostęp z wątku w tle
HttpContext
nie jest bezpieczny wątkowo. Odczytywanie lub zapisywanie właściwości HttpContext
poza przetwarzaniem żądania może spowodować, że NullReferenceExceptionelement .
Uwaga
Jeśli aplikacja generuje sporadyczne NullReferenceException
błędy, przejrzyj części kodu, które rozpoczynają przetwarzanie w tle lub które kontynuują przetwarzanie po zakończeniu żądania. Poszukaj błędów, takich jak zdefiniowanie metody kontrolera jako async void
.
Aby bezpiecznie wykonywać pracę w tle z HttpContext
danymi:
- Skopiuj wymagane dane podczas przetwarzania żądań.
- Przekaż skopiowane dane do zadania w tle.
- Nie odwołuj się do
HttpContext
danych równoległych. Wyodrębnij dane potrzebne z kontekstu przed rozpoczęciem zadań równoległych.
Aby uniknąć niebezpiecznego kodu, nigdy nie należy przekazywać elementu HttpContext
do metody, która działa w tle. Przekaż wymagane dane. W poniższym przykładzie wywołana jest nazwana w SendEmailCore
celu rozpoczęcia wysyłania wiadomości e-mail. Element correlationId
jest przekazywany do SendEmailCore
elementu , a nie .HttpContext
Wykonanie kodu nie czeka na SendEmailCore
ukończenie:
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
w Razor składnikach (Blazor)
Aby uzyskać więcej informacji, zobacz IHttpContextAccessor/HttpContext w aplikacjach ASP.NET Core Blazor.