Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Acesso
Observação
Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão .NET 10 deste artigo.
Advertência
Esta versão do ASP.NET Core não é mais suportada. Para obter mais informações, consulte a Política de suporte do .NET e do .NET Core. Para a versão atual, consulte a versão .NET 9 deste artigo.
HttpContext encapsula toda a informação sobre um pedido e resposta HTTP individual. Uma HttpContext instância é inicializada quando um pedido HTTP é recebido. A HttpContext instância é acessível através de middleware e frameworks de aplicações, como controladores Web API, Razor Pages, SignalR, gRPC, entre outros.
Para informações sobre como usar HttpContext com um pedido HTTP e resposta, veja Usar HttpContext no ASP.NET Core.
Aceder HttpContext a partir de Razor Páginas
Os Razor Pages PageModel disponibilizam a(s) PageModel.HttpContext propriedade(s):
public class IndexModel : PageModel
{
public void OnGet()
{
var message = HttpContext.Request.PathBase;
// ...
}
}
A mesma propriedade pode ser usada na Vista de Página correspondente: Razor
@page
@model IndexModel
@{
var message = HttpContext.Request.PathBase;
// ...
}
Acesso HttpContext a partir de uma Razor vista no MVC
Razor as Visualizações no padrão MVC expõem a HttpContext através da propriedade RazorPage.Context da visualização. O exemplo seguinte recupera o nome de utilizador atual numa aplicação intranet usando a Autenticação Windows:
@{
var username = Context.User.Identity.Name;
// ...
}
Acesso HttpContext a partir de um controlador
Os controladores expõem a propriedade ControllerBase.HttpContext :
public class HomeController : Controller
{
public IActionResult About()
{
var pathBase = HttpContext.Request.PathBase;
// ...
return View();
}
}
Acesso HttpContext a partir de APIs mínimas
Para usar HttpContext a partir de APIs mínimas, adicione um HttpContext parâmetro:
app.MapGet("/", (HttpContext context) => context.Response.WriteAsync("Hello World"));
Acesso HttpContext a partir do middleware
Para utilizar HttpContext de componentes middleware personalizados, use o parâmetro HttpContext passado para o método Invoke ou InvokeAsync.
public class MyCustomMiddleware
{
// ...
public async Task InvokeAsync(HttpContext context)
{
// ...
}
}
Acesso HttpContext a partir de SignalR
Para usar HttpContext a partir de SignalR, chame o GetHttpContext método em Hub.Context:
public class MyHub : Hub
{
public async Task SendMessage()
{
var httpContext = Context.GetHttpContext();
// ...
}
}
Aceder HttpContext a partir de métodos gRPC
Para usar HttpContext a partir de métodos gRPC, veja Resolve HttpContext em métodos gRPC.
Acesso HttpContext a partir de componentes personalizados
Para outros componentes do framework e personalizados que requerem acesso a HttpContext, a abordagem recomendada é registrar uma dependência usando o contêiner incorporado de Injeção de Dependências (DI). O contentor DI fornece o IHttpContextAccessor a quaisquer classes que o declarem como dependência nos seus construtores:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
builder.Services.AddHttpContextAccessor();
builder.Services.AddTransient<IUserRepository, UserRepository>();
No exemplo a seguir:
-
UserRepositorydeclara a sua dependência emIHttpContextAccessor. - A dependência é fornecida quando DI resolve a cadeia de dependências e cria uma instância de
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 Acesso a partir de um thread em segundo plano
HttpContext não é seguro para execução simultânea. Ler ou escrever propriedades do HttpContext fora do processamento de um pedido pode resultar num NullReferenceException.
Observação
Se a sua aplicação gerar erros esporádicos NullReferenceException , reveja partes do código que iniciam o processamento em segundo plano ou que continuam a processar após a conclusão de um pedido. Procure erros, como definir um método controlador como async void.
Para fazer trabalho em segundo plano com HttpContext dados de forma segura:
- Copie os dados necessários durante o processamento dos pedidos.
- Passa os dados copiados para uma tarefa em segundo plano.
-
Não consulte
HttpContextdados em tarefas paralelas. Extrai os dados necessários do contexto antes de começares as tarefas paralelas.
Para evitar código inseguro, nunca passes HttpContext para um método que faça trabalho em segundo plano. Passe os dados necessários em vez disso. No exemplo seguinte, SendEmail chama SendEmailCoreAsync para começar a enviar um email. O valor do X-Correlation-Id cabeçalho é passado para SendEmailCoreAsync em vez do HttpContext. A execução de código não espera até SendEmailCoreAsync terminar:
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 em Razor componentes (Blazor)
Para mais informações, consulte IHttpContextAccessor/HttpContext em aplicações ASP.NET CoreBlazor.
HttpContext encapsula toda a informação sobre um pedido e resposta HTTP individual. Uma HttpContext instância é inicializada quando um pedido HTTP é recebido. A HttpContext instância é acessível através de middleware e frameworks de aplicações, como controladores Web API, Razor Pages, SignalR, gRPC, entre outros.
Para informações sobre como usar HttpContext com um pedido HTTP e resposta, veja Usar HttpContext no ASP.NET Core.
Aceder HttpContext a partir de Razor Páginas
Os Razor Pages PageModel disponibilizam a(s) PageModel.HttpContext propriedade(s):
public class IndexModel : PageModel
{
public void OnGet()
{
var message = HttpContext.Request.PathBase;
// ...
}
}
A mesma propriedade pode ser usada na Vista de Página correspondente: Razor
@page
@model IndexModel
@{
var message = HttpContext.Request.PathBase;
// ...
}
Acesso HttpContext a partir de uma Razor vista no MVC
Razor as Visualizações no padrão MVC expõem a HttpContext através da propriedade RazorPage.Context da visualização. O exemplo seguinte recupera o nome de utilizador atual numa aplicação intranet usando a Autenticação Windows:
@{
var username = Context.User.Identity.Name;
// ...
}
Acesso HttpContext a partir de um controlador
Os controladores expõem a propriedade ControllerBase.HttpContext :
public class HomeController : Controller
{
public IActionResult About()
{
var pathBase = HttpContext.Request.PathBase;
// ...
return View();
}
}
Acesso HttpContext a partir do middleware
Ao trabalhar com componentes middleware personalizados, HttpContext é passado para o método Invoke ou para o método InvokeAsync.
public class MyCustomMiddleware
{
public Task InvokeAsync(HttpContext context)
{
// ...
}
}
Acesso HttpContext a partir de componentes personalizados
Para outros componentes do framework e personalizados que requerem acesso a HttpContext, a abordagem recomendada é registrar uma dependência usando o contêiner incorporado de Injeção de Dependências (DI). O contentor DI fornece o IHttpContextAccessor a quaisquer classes que o declarem como dependência nos seus construtores:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddHttpContextAccessor();
services.AddTransient<IUserRepository, UserRepository>();
}
No exemplo a seguir:
-
UserRepositorydeclara a sua dependência emIHttpContextAccessor. - A dependência é fornecida quando DI resolve a cadeia de dependências e cria uma instância de
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 Acesso a partir de um thread em segundo plano
HttpContext não é seguro para execução simultânea. Ler ou escrever propriedades do HttpContext fora do processamento de um pedido pode resultar num NullReferenceException.
Observação
Se a sua aplicação gerar erros esporádicos NullReferenceException , reveja partes do código que iniciam o processamento em segundo plano ou que continuam a processar após a conclusão de um pedido. Procure erros, como definir um método controlador como async void.
Para fazer trabalho em segundo plano com HttpContext dados de forma segura:
- Copie os dados necessários durante o processamento dos pedidos.
- Passa os dados copiados para uma tarefa em segundo plano.
-
Não consulte
HttpContextdados em tarefas paralelas. Extrai os dados necessários do contexto antes de começares as tarefas paralelas.
Para evitar código inseguro, nunca passes o HttpContext para um método que realiza trabalho em segundo plano. Passe os dados necessários em vez disso. No exemplo seguinte, SendEmailCore é chamado para começar a enviar um email. O correlationId é passado para SendEmailCore, não o HttpContext. A execução de código não espera até SendEmailCore terminar:
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 em Razor componentes (Blazor)
Para mais informações, consulte IHttpContextAccessor/HttpContext em aplicações ASP.NET CoreBlazor.