asp.net-mvc - sesiones - variables de session c# mvc 4
Null de sesiĆ³n en constructores de controlador MVC de ASP.Net (5)
¿Por qué la sesión es nula en los constructores de Controladores? Se puede acceder desde los métodos de Acción. Presumiblemente, debido a que el marco de enrutamiento MVC es responsable de reactivar un controlador, simplemente no ha (re) instanciado la sesión en ese punto.
¿Alguien sabe si esto es por diseño y, de ser así, por qué?
[Logré eludir el problema usando un patrón de carga diferida]
Andrei tiene razón, es nulo porque cuando se ejecuta bajo el marco MVC de ASP.NET, el HttpContext (y, por lo tanto, HttpContext.Session) no se establece cuando la clase del controlador se crea como cabría esperar, sino que se configura ("inyecta") más tarde por la clase ControllerBuilder. Si desea una mejor comprensión del ciclo de vida, puede desplegar el marco ASP.NET MVC (la fuente está disponible) o consultar: esta página
Si necesita acceder a la sesión, una forma sería anular el método "OnActionExecuting" y acceder allí, ya que estará disponible en ese momento.
Sin embargo, como sugiere Andrei, si su código depende de la Sesión, entonces podría ser difícil escribir pruebas unitarias, entonces quizás podría considerar envolver la Sesión en una clase auxiliar que luego puede ser intercambiada por una diferente, no- Versión web cuando se ejecuta bajo pruebas unitarias, por lo tanto, desenganche su controlador de la web.
La sesión se inyecta más adelante en el ciclo de vida. ¿Por qué necesitas la sesión en el constructor de todos modos? Si lo necesita para TDD, debe envolver la sesión en un objeto ficticio.
Puede anular el método Initialize para configurar su sesión.
protected override void Initialize(RequestContext requestContext)
Si está utilizando un contenedor IoC, intente inyectar y usar HttpSessionStateBase
lugar del objeto Session
:
private static Container defaultContainer()
{
return new Container(ioc =>
{
// session manager setup
ioc.For<HttpSessionStateBase>()
.Use(ctx => new HttpSessionStateWrapper(HttpContext.Current.Session));
});
}
Además de las otras respuestas aquí, mientras Controller.Session
no se rellena en el constructor, puede acceder a la sesión a través de:
System.Web.HttpContext.Current.Session
con la advertencia estándar de que esto potencialmente reduce la capacidad de prueba de su controlador.