Preciso acessar a corrente HttpContext
em um método estático ou em um serviço utilitário.
Com o clássico ASP.NET MVC e System.Web
, eu usaria apenas HttpContext.Current
para acessar o contexto estaticamente. Mas como faço isso no ASP.NET Core?
c#
asp.net-core
maxswitcher
fonte
fonte
IHttpContextAccessor
estaria disponível apenas em locais onde o contêiner de DI está resolvendo a instância.CallContextServiceLocator
resolver um serviço, mesmo a partir de uma instância não-DI-injetada:CallContextServiceLocator.Locator.ServiceProvider.GetService<IHttpContextAccessor>()
. Na prática, é uma grande coisa se você pode evitá-lo :)Necromante.
SIM PODE
Dica secreta para quem está migrando grandes
juncospedaços (suspiro, deslize freudiano) de código.O método a seguir é um carbúnculo maligno de um hack que está envolvido ativamente na execução do trabalho expresso de satanás (aos olhos dos desenvolvedores de estrutura do .NET Core), mas funciona :
No
public class Startup
adicionar uma propriedade
E, em seguida, adicione um singleton IHttpContextAccessor à DI no ConfigureServices.
Em seguida, no Configure
adicione o parâmetro DI
IServiceProvider svp
, para que o método se pareça com:Em seguida, crie uma classe de substituição para System.Web:
Agora no Configure, onde você adicionou
IServiceProvider svp
, salve este provedor de serviços na variável estática "ServiceProvider" na classe fictícia System.Web.HttpContext (System.Web.HttpContext.ServiceProvider)e defina HostingEnvironment.IsHosted como true
isso é essencialmente o que System.Web fez, só que você nunca viu (acho que a variável foi declarada como interna em vez de pública).
Como nos formulários da Web do ASP.NET, você recebe um NullReference ao tentar acessar um HttpContext quando não houver nenhum, como costumava ser
Application_Start
no global.asax.Sublinho novamente, isso só funciona se você realmente adicionou
como eu escrevi você deveria.
Bem-vindo ao padrão ServiceLocator no padrão DI;)
Para riscos e efeitos colaterais, pergunte ao seu médico ou farmacêutico residente - ou estude as fontes do .NET Core em github.com/aspnet e faça alguns testes.
Talvez um método mais sustentável possa adicionar essa classe auxiliar
E, em seguida, chamando HttpContext.Configure em Inicialização-> Configurar
fonte
Apenas para adicionar às outras respostas ...
No ASP.NET Core 2.1, existe o
AddHttpContextAccessor
método de extensão , que registrará oIHttpContextAccessor
tempo de vida correto:fonte
A maneira mais legítima que eu criei foi injetar IHttpContextAccessor na sua implementação estática da seguinte maneira:
Em seguida, atribuir o IHttpContextAccessor no Startup Configure deve fazer o trabalho.
Eu acho que você também deve registrar o serviço singleton:
fonte
De acordo com este artigo: Acessando o HttpContext fora dos componentes da estrutura no ASP.NET Core
Então:
Então:
Você pode usá-lo assim:
fonte
Na inicialização
No controlador
fonte