Diferencia entre Session y HttpContext.Current.Session

¿Cuál es la diferencia entre Session y HttpContext.Current.Session object?

Un poco tarde aquí, pero aquí hay algo que acabo de descubrir.

@Phillipe Leybaert y @CSharpAtl son incorrectos. La propiedad Session HttpApplication muestra un comportamiento diferente al de la propiedad HttpContext.Current.Session . Ambos devolverán una referencia a la misma instancia de HttpSessionState si hay una disponible. Difieren en lo que hacen cuando no hay ninguna instancia de HttpSessionState disponible para la solicitud actual.

No todos los HttpHandler s proporcionan el estado de la sesión. Para hacerlo, HttpHandler debe implementar [una o ambas?] Las interfaces de marcador IRequiresSessionState o IReadOnlySessionState .

HttpContext.Current.Session simplemente devuelve null si no hay sesión disponible.

La implementación de HttpApplication de la propiedad Session arroja una HttpException con el mensaje Session state is not available in this context. en lugar de devolver una referencia null .

Algunos ejemplos de HttpHandler que no implementan sesión son los controladores predeterminados para recursos normalmente estáticos, como archivos de imagen y CSS. Cualquier referencia a la propiedad Session HttpApplication en tales casos (como en los global.asax eventos global.asax ) dará como resultado que se HttpException una HttpException .

No hace falta decir que la inesperada HttpException proporciona un WTF? momento si no lo estás esperando.

La propiedad Session de la clase HttpApplication se implementa así (desde Reflector):

 [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public HttpSessionState Session { get { HttpSessionState session = null; if (this._session != null) { session = this._session; } else if (this._context != null) { session = this._context.Session; } if (session == null) { throw new HttpException(SR.GetString("Session_not_available")); } return session; } } 

No hay diferencia.

El getter para Page.Session devuelve la sesión de contexto.

Nada. Session solo apunta a HttpContext.Current.Session .