Eventos
Campeonato Mundial de Visualização de Dados do Power BI
14 de fev., 16 - 31 de mar., 16
Com 4 chances de participar, você pode ganhar um pacote de conferência e chegar à Grande Final AO VIVO em Las Vegas
Saiba maisNão há mais suporte para esse navegador.
Atualize o Microsoft Edge para aproveitar os recursos, o suporte técnico e as atualizações de segurança mais recentes.
HttpContext
no ASP.NET CoreObservação
Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão .NET 9 deste artigo.
Aviso
Esta versão do ASP.NET Core não tem mais suporte. 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.
Importante
Essas informações relacionam-se ao produto de pré-lançamento, que poderá ser substancialmente modificado antes do lançamento comercial. A Microsoft não oferece nenhuma garantia, explícita ou implícita, quanto às informações fornecidas aqui.
Para a versão atual, consulte a versão .NET 9 deste artigo.
HttpContext encapsula todas as informações específicas sobre uma solicitação e uma resposta HTTP específicas. Uma instância HttpContext
é inicializada quando uma solicitação HTTP é recebida. A instância HttpContext
pode ser acessada por middleware e estruturas como controladores de API Web, Razor Pages, SignalR, gRPC e muito mais.
Para obter informações sobre como usar HttpContext
com uma solicitação e resposta HTTP, consulte Usar HttpContext no ASP.NET Core.
O Razor Pages PageModel expõe a propriedade PageModel.HttpContext:
public class IndexModel : PageModel
{
public void OnGet()
{
var message = HttpContext.Request.PathBase;
// ...
}
}
A mesma propriedade pode ser usada no Modo de Exibição de Página correspondente de Razor:
@page
@model IndexModel
@{
var message = HttpContext.Request.PathBase;
// ...
}
Razor exibições no padrão MVC expõem o HttpContext
por meio da propriedade RazorPage.Context na exibição. O exemplo a seguir recupera o nome de usuário atual em um aplicativo de Intranet usando a Autenticação do Windows:
@{
var username = Context.User.Identity.Name;
// ...
}
Os controladores expõem a propriedade ControllerBase.HttpContext:
public class HomeController : Controller
{
public IActionResult About()
{
var pathBase = HttpContext.Request.PathBase;
// ...
return View();
}
}
Para usar HttpContext
a partir de APIs mínimas, adicione um parâmetro HttpContext
:
app.MapGet("/", (HttpContext context) => context.Response.WriteAsync("Hello World"));
Para usar HttpContext
a partir de componentes de middleware personalizados, use o parâmetro HttpContext
passado para o método Invoke
ou InvokeAsync
:
public class MyCustomMiddleware
{
// ...
public async Task InvokeAsync(HttpContext context)
{
// ...
}
}
Para usar HttpContext
a partir de SignalR, chame o método GetHttpContext em Hub.Context:
public class MyHub : Hub
{
public async Task SendMessage()
{
var httpContext = Context.GetHttpContext();
// ...
}
}
Para usar HttpContext
a partir de métodos gRPC, consulte Resolver HttpContext
em métodos gRPC.
Para outras estruturas e componentes personalizados que exigem acesso ao HttpContext
, a abordagem recomendada é registrar uma dependência usando o contêiner integrado de DI (injeção de dependência). O contêiner de DI fornece o IHttpContextAccessor
para todas as classes que o declaram como uma dependência em seus construtores.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
builder.Services.AddHttpContextAccessor();
builder.Services.AddTransient<IUserRepository, UserRepository>();
No exemplo a seguir:
UserRepository
declara sua dependência no IHttpContextAccessor
.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
não é thread-safe. Ler ou gravar propriedades de HttpContext
fora do processamento de uma solicitação pode resultar em um NullReferenceException.
Observação
Se seu aplicativo gera erros NullReferenceException
esporádicos, revise as partes do código que iniciam o processamento em segundo plano ou que continuam o processamento depois que uma solicitação é concluída. Procure por erros como a definição de um método controlador como async void
.
Para executar com segurança o trabalho em segundo plano com os dados de HttpContext
:
HttpContext
em tarefas paralelas. Extraia os dados necessários do contexto antes de iniciar as tarefas paralelas.Para evitar o código não seguro, nunca passe o HttpContext
para um método que realiza o trabalho em segundo plano. Em vez disso, passe os dados necessários. Em vez disso, passe os dados necessários. No exemplo a seguir, SendEmail
chama SendEmailCoreAsync
para começar a enviar um email. O valor do cabeçalho de X-Correlation-Id
é passado para SendEmailCoreAsync
em vez de HttpContext
. A execução do código não aguarda a conclusão de 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)
{
// ...
}
}
Para mais informações, consulte IHttpContextAccessor/HttpContext em aplicativosdo ASP.NET Core Blazor.
HttpContext encapsula todas as informações específicas sobre uma solicitação e uma resposta HTTP específicas. Uma instância HttpContext
é inicializada quando uma solicitação HTTP é recebida. A instância HttpContext
pode ser acessada por middleware e estruturas como controladores de API Web, Razor Pages, SignalR, gRPC e muito mais.
Para obter informações sobre como usar HttpContext
com uma solicitação e resposta HTTP, consulte Usar HttpContext no ASP.NET Core.
O Razor Pages PageModel expõe a propriedade PageModel.HttpContext:
public class IndexModel : PageModel
{
public void OnGet()
{
var message = HttpContext.Request.PathBase;
// ...
}
}
A mesma propriedade pode ser usada no Modo de Exibição de Página correspondente de Razor:
@page
@model IndexModel
@{
var message = HttpContext.Request.PathBase;
// ...
}
Razor exibições no padrão MVC expõem o HttpContext
por meio da propriedade RazorPage.Context na exibição. O exemplo a seguir recupera o nome de usuário atual em um aplicativo de Intranet usando a Autenticação do Windows:
@{
var username = Context.User.Identity.Name;
// ...
}
Os controladores expõem a propriedade ControllerBase.HttpContext:
public class HomeController : Controller
{
public IActionResult About()
{
var pathBase = HttpContext.Request.PathBase;
// ...
return View();
}
}
Ao trabalhar com componentes de middleware personalizados, HttpContext
é passado para o método Invoke
ou InvokeAsync
:
public class MyCustomMiddleware
{
public Task InvokeAsync(HttpContext context)
{
// ...
}
}
Para outras estruturas e componentes personalizados que exigem acesso ao HttpContext
, a abordagem recomendada é registrar uma dependência usando o contêiner integrado de DI (injeção de dependência). O contêiner de DI fornece o IHttpContextAccessor
para todas as classes que o declaram como uma dependência em seus construtores.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddHttpContextAccessor();
services.AddTransient<IUserRepository, UserRepository>();
}
No exemplo a seguir:
UserRepository
declara sua dependência no IHttpContextAccessor
.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
não é thread-safe. Ler ou gravar propriedades de HttpContext
fora do processamento de uma solicitação pode resultar em um NullReferenceException.
Observação
Se seu aplicativo gera erros NullReferenceException
esporádicos, revise as partes do código que iniciam o processamento em segundo plano ou que continuam o processamento depois que uma solicitação é concluída. Procure por erros como a definição de um método controlador como async void
.
Para executar com segurança o trabalho em segundo plano com os dados de HttpContext
:
HttpContext
em tarefas paralelas. Extraia os dados necessários do contexto antes de iniciar as tarefas paralelas.Para evitar o código não seguro, nunca passe o HttpContext
para um método que realiza o trabalho em segundo plano. Em vez disso, passe os dados necessários. No exemplo a seguir, SendEmailCore
é chamado para começar a enviar um email. O correlationId
é passado para SendEmailCore
, não para HttpContext
. A execução do código não aguarda a conclusão de 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)
{
// ...
}
}
Para obter mais informações, consulte IHttpContextAccessor/HttpContext em aplicativos ASP.NET Core Blazor.
Comentários do ASP.NET Core
O ASP.NET Core é um projeto código aberto. Selecione um link para fornecer comentários:
Eventos
Campeonato Mundial de Visualização de Dados do Power BI
14 de fev., 16 - 31 de mar., 16
Com 4 chances de participar, você pode ganhar um pacote de conferência e chegar à Grande Final AO VIVO em Las Vegas
Saiba maisTreinamento
Módulo
Implementar operações HTTP em aplicativos Web do ASP.NET Core Blazor - Training
Implementar operações HTTP em aplicativos Web do ASP.NET Core Blazor