Acessar o HttpContext no ASP.NET CoreAccess HttpContext in ASP.NET Core

Os aplicativos ASP.NET Core acessam o HttpContext por meio da interface IHttpContextAccessor e da implementação padrão do HttpContextAccessor.ASP.NET Core apps access the HttpContext through the IHttpContextAccessor interface and its default implementation HttpContextAccessor. Só é necessário usar o IHttpContextAccessor quando você precisar acessar o HttpContext em um serviço.It's only necessary to use IHttpContextAccessor when you need access to the HttpContext inside a service.

Usar o HttpContext de Razor PagesUse HttpContext from Razor Pages

O PageModel das Razor Pages expõe a propriedade HttpContext:The Razor Pages PageModel exposes the HttpContext property:

public class AboutModel : PageModel
{
    public string Message { get; set; }

    public void OnGet()
    {
        Message = HttpContext.Request.PathBase;
    }
}

Usar o HttpContext de uma exibição do RazorUse HttpContext from a Razor view

As exibições do Razor expõem o HttpContext diretamente por meio de uma propriedade RazorPage.Context na exibição.Razor views expose the HttpContext directly via a RazorPage.Context property on the view. O exemplo a seguir recupera o nome de usuário atual em um aplicativo de Intranet usando a Autenticação do Windows:The following example retrieves the current username in an Intranet app using Windows Authentication:

@{
    var username = Context.User.Identity.Name;
}

Usar o HttpContext de um controladorUse HttpContext from a controller

Os controladores expõem a propriedade ControllerBase.HttpContext:Controllers expose the ControllerBase.HttpContext property:

public class HomeController : Controller
{
    public IActionResult About()
    {
        var pathBase = HttpContext.Request.PathBase;
        // Do something with the PathBase.

        return View();
    }
}

Usar o HttpContext de middlewareUse HttpContext from middleware

Ao trabalhar com componentes personalizados de middleware, o HttpContext é passado para o método Invoke ou InvokeAsync e pode ser acessado quando o middleware for configurado:When working with custom middleware components, HttpContext is passed into the Invoke or InvokeAsync method and can be accessed when the middleware is configured:

public class MyCustomMiddleware
{
    public Task InvokeAsync(HttpContext context)
    {
        // Middleware initialization optionally using HttpContext
    }
}

Usar o HttpContext de componentes personalizadosUse HttpContext from custom components

Para outras estruturas e componentes personalizados que exigem acesso ao HttpContext, a abordagem recomendada é registrar uma dependência usando o contêiner integrado de injeção de dependência.For other framework and custom components that require access to HttpContext, the recommended approach is to register a dependency using the built-in dependency injection container. O contêiner de injeção de dependência fornece o IHttpContextAccessor para todas as classes que o declaram como uma dependência em seus construtores.The dependency injection container supplies the IHttpContextAccessor to any classes that declare it as a dependency in their constructors.

public void ConfigureServices(IServiceCollection services)
{
     services.AddMvc()
         .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
     services.AddHttpContextAccessor();
     services.AddTransient<IUserRepository, UserRepository>();
}
public void ConfigureServices(IServiceCollection services)
{
     services.AddMvc();
     services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
     services.AddTransient<IUserRepository, UserRepository>();
}

No exemplo a seguir:In the following example:

  • o UserRepository declara sua dependência no IHttpContextAccessor.UserRepository declares its dependency on IHttpContextAccessor.
  • A dependência é fornecida quando a injeção de dependência resolve a cadeia de dependências e cria uma instância do UserRepository.The dependency is supplied when dependency injection resolves the dependency chain and creates an instance of 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);
    }
}

Acesso a HttpContext de um thread em segundo planoHttpContext access from a background thread

HttpContext não é thread-safe.HttpContext is not thread-safe. Ler ou gravar propriedades de HttpContext fora do processamento de uma solicitação pode resultar em um NullReferenceException.Reading or writing properties of the HttpContext outside of processing a request can result in a NullReferenceException.

Observação

Usar HttpContext fora do processamento de uma solicitação geralmente resulta em um NullReferenceException.Using HttpContext outside of processing a request often results in a NullReferenceException. Se seu aplicativo gera NullReferenceExceptions 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.If your app generates sporadic NullReferenceExceptions , review parts of the code that start background processing, or that continue processing after a request completes. Procure erros, como definir um método de controlador como async void.Look for mistakes, such as defining a controller method as async void.

Para executar com segurança o trabalho em segundo plano com os dados de HttpContext:To safely perform background work with HttpContext data:

  • Copie os dados necessários durante o processamento da solicitação.Copy the required data during request processing.
  • Passe os dados copiados para uma tarefa em segundo plano.Pass the copied data to a background task.

Para evitar o código não seguro, nunca passe o HttpContext em um método que realiza o trabalho em segundo plano. Em vez disso, passe os dados necessários.To avoid unsafe code, never pass the HttpContext into a method that does background work - pass the data you need instead.

public class EmailController
{
    public ActionResult SendEmail(string email)
    {
        var correlationId = HttpContext.Request.Headers["x-correlation-id"].ToString();

        // Starts sending an email, but doesn't wait for it to complete
        _ = SendEmailCore(correlationId);
        return View();
    }

    private async Task SendEmailCore(string correlationId)
    {
        // send the email
    }
}