.NET

24 nov, 2017

ASP .NET Core 2.0 – Usando o HttpContext

Publicidade

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 está 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 mostra 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.