ASP .NET Core 2.0 - Usando o HttpContext


 Neste artigo vou mostrar como usar os recursos do HttpContext na ASP .NET Core.

Muitas vezes precisamos acessar informações sobre o request, o response, informações sobre autenticação e outras informações da requisição atual. Para isso podemos usar a classe HttpContext

Essa classe encapsula toda a informação HTTP específica sobre uma requisição HTTP individual e o seu comportamento é praticamente o mesmo do HttpContext que era usado na ASP .NET com uma diferença: ele não esta automaticamente disponível em todos os lugares do seu código como antes.

Se você estiver em um Controller ele esta disponível pois todo o controlador herda da classe Controller que herda da classe BaseController que fornece a instância de HttpContext no controlador.

Se você estiver em um Middleware ele é passado como um parâmetro :

public async Task Invoke(HttpContext httpContext)
{
   .....
    await next.Invoke(httpContext);
}

Agora, se você precisar acessar os recursos do HttpContext em um serviço ou na sua camada de domínio você terá que fazer o seguinte:

1- Registrar a interface IHttpContextAccessor() para injeção de dependência no método ConfigureServices() da classe Startup() :

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    ...
}

2- - Injetar a dependência para obter a referência ao HttpContext e poder usá-lo :

public class UsuarioService : IUsuarioService
{
private readonly IHttpContextAccessor _httpContextAccessor;
  public UsuarioService(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
  public bool IsUserLoggedIn()
{
var context = _httpContextAccessor.HttpContext;
return context.User.Identities.Any(x => x.IsAuthenticated);
}
}

O código acima mostra como exemplo a utilização do HttpContext em um serviço onde, após registrar a interface IHttpContextAccessor(), estamos obtendo a referência à mesma via injeção de dependência.

Acessando o HttpContext de um Controller

Apenas para ilustrar temos abaixo o código em um controlador que mostrar como acessar informações do HttpContext:

System;
using System.Text.Encodings.Web;
using Microsoft.AspNetCore.Mvc;
namespace mvc1.Controllers
{
    public class ProdutoController : Controller
    {
        public string Index()
        {
            var https = HttpContext.Request.IsHttps;
            var caminho = HttpContext.Request.Path;
            var status = HttpContext.Response.StatusCode;
            var conexao = HttpContext.Connection.ToString();
            return https + "\r\n" + caminho + "\r\n" + status + "\r\n" + conexao;
        }
    }
}
 
 

Assim, nas versões anteriores do .NET Core, o IHttpContextAccessor era registrado automaticamente.

Agora a partir da versão 1.1 você tem que registrá-lo manualmente se você pretende usar esses serviços internos ou na sua camada de domínio.

"Se alguém quer vir após mim (Jesus), a si mesmo se negue, tome a sua cruz e siga-me" (Mateus 16:24).
 

Referências:


José Carlos Macoratti