Necesito acceder a current HttpContext
en un método estático o un servicio de utilidad.
Con ASP.NET MVC clásico y System.Web
, solo lo usaría HttpContext.Current
para acceder al contexto de forma estática. Pero, ¿cómo hago esto en ASP.NET Core?
c#
asp.net-core
maxswitcher
fuente
fuente
IHttpContextAccessor
solo estaría disponible en lugares donde el contenedor DI está resolviendo la instancia.CallContextServiceLocator
de resolver un servicio, incluso desde una instancia inyecta la no-DI:CallContextServiceLocator.Locator.ServiceProvider.GetService<IHttpContextAccessor>()
. En la práctica, es una gran cosa si puedes evitarlo :)Nigromancia
SÍ PUEDES CONSEJO
secreto para aquellos que migran grandes
chatarratrozos (suspiro, deslizamiento freudiano) de código.El siguiente método es un malvado truco de un hack que se dedica activamente a llevar a cabo el trabajo expreso de satanás (a los ojos de los desarrolladores de .NET Core Framework), pero funciona :
En
public class Startup
agregar una propiedad
Y luego agregue un IHttpContextAccessor singleton a DI en ConfigureServices.
Luego en Configurar
agregue el parámetro DI
IServiceProvider svp
, para que el método se vea así:A continuación, cree una clase de reemplazo para System.Web:
Ahora en Configurar, donde agregó el
IServiceProvider svp
, guarde este proveedor de servicios en la variable estática "ServiceProvider" en la clase ficticia recién creada System.Web.HttpContext (System.Web.HttpContext.ServiceProvider)y establezca HostingEnvironment.IsHosted en true
esto es esencialmente lo que hizo System.Web, solo que nunca lo viste (supongo que la variable se declaró como interna en lugar de pública).
Al igual que en los formularios web ASP.NET, obtendrá una NullReference cuando intente acceder a un HttpContext cuando no haya ninguno, como solía estar
Application_Start
en global.asax.Insisto nuevamente, esto solo funciona si realmente agregaste
como te escribí deberías.
Bienvenido al patrón ServiceLocator dentro del patrón DI;)
Para conocer los riesgos y los efectos secundarios, consulte a su médico o farmacéutico residente, o estudie las fuentes de .NET Core en github.com/aspnet y realice algunas pruebas.
Quizás un método más fácil de mantener sería agregar esta clase auxiliar
Y luego llamando a HttpContext.Configure en Startup-> Configure
fuente
Solo para agregar a las otras respuestas ...
En ASP.NET Core 2.1, existe el
AddHttpContextAccessor
método de extensión , que registraráIHttpContextAccessor
con la vida útil correcta:fuente
La forma más legítima que se me ocurrió fue inyectando IHttpContextAccessor en su implementación estática de la siguiente manera:
Luego asignar el IHttpContextAccessor en la Configuración de inicio debería hacer el trabajo.
Supongo que también deberías necesitar registrar el servicio singleton:
fuente
De acuerdo con este artículo: Acceso a HttpContext fuera de los componentes del marco en ASP.NET Core
Luego:
Luego:
Puedes usarlo así:
fuente
En el inicio
En el controlador
fuente