Partilhar via


Acesso HttpContext no ASP.NET Core

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:

  • UserRepository declara a sua dependência em IHttpContextAccessor.
  • 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 HttpContext dados 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:

  • UserRepository declara a sua dependência em IHttpContextAccessor.
  • 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 HttpContext dados 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.