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.