visual - ¿Por qué hay dos tipos de estado de sesión incompatibles en ASP.NET?
mvc 4+ (1)
En ASP.NET MVC se introdujeron abstracciones sobre los objetos clásicos HttpContext, Request, Response, Session. Representan clases abstractas y están expuestas en todo el marco de MVC para ocultar el contexto subyacente y simplificar las pruebas unitarias porque las clases abstractas pueden ser burladas.
Por ejemplo, para el objeto de sesión tiene HttpSessionStateBase
y su implementación HttpSessionStateWrapper
.
Aquí hay un ejemplo de cómo convertir entre la sesión clásica de ASP.NET y la abstracción:
HttpSessionStateBase session = new HttpSessionStateWrapper(HttpContext.Current.Session);
Entonces, el System.Web.SessionState.HttpSessionState
que se refiere es el objeto de sesión subyacente que existía desde clásico ASP.NET 1.0. En MVC este objeto está envuelto en un HttpSessionStateWrapper
. Pero dado que ASP.NET MVC es una aplicación ASP.NET, aún obtienes Global.asax en el que tienes la sesión vacía.
Veo dos maneras de trabajar con datos de sesión en ASP.NET MVC:
-
System.Web.SessionState.HttpSessionState
, disponible enHttpApplication
-
System.Web.HttpSessionStateBase
, disponible enController
Los datos almacenados en uno parecen estar disponibles en el otro.
Lamentablemente, el único antecesor común de estos dos tipos es System.Object
, lo que significa que no puedo crear código de utilidad reutilizable para la abstracción de ninguno de ellos.
¿Por qué es la API de esta manera? ¿Hay alguna diferencia importante entre los dos que me estoy perdiendo?