¿Cómo acceder a las variables de sesión de cualquier clase en ASP.NET?

He creado un archivo de clase en la carpeta App_Code en mi aplicación. Tengo una variable de sesión

Session["loginId"] 

Quiero acceder a las variables de esta sesión en mi clase, pero cuando escribo la siguiente línea, aparece un error

 Session["loginId"] 

¿Alguien puede decirme cómo acceder a las variables de sesión dentro de una clase que se crea en la carpeta app_code en ASP.NET 2.0 (C #)

    (Actualizado para completar)
    Puede acceder a las variables de sesión desde cualquier página o control utilizando Session["loginId"] y desde cualquier clase (por ejemplo, desde el interior de una biblioteca de clases), utilizando System.Web.HttpContext.Current.Session["loginId"].

    Pero por favor sigue leyendo para mi respuesta original …


    Siempre utilizo una clase contenedora alrededor de la sesión ASP.NET para simplificar el acceso a las variables de la sesión:

     public class MySession { // private constructor private MySession() { Property1 = "default value"; } // Gets the current session. public static MySession Current { get { MySession session = (MySession)HttpContext.Current.Session["__MySession__"]; if (session == null) { session = new MySession(); HttpContext.Current.Session["__MySession__"] = session; } return session; } } // **** add your session properties here, eg like this: public string Property1 { get; set; } public DateTime MyDate { get; set; } public int LoginId { get; set; } } 

    Esta clase almacena una instancia de sí mismo en la sesión de ASP.NET y le permite acceder a las propiedades de su sesión de una manera segura de cualquier clase, por ejemplo, de esta manera:

     int loginId = MySession.Current.LoginId; string property1 = MySession.Current.Property1; MySession.Current.Property1 = newValue; DateTime myDate = MySession.Current.MyDate; MySession.Current.MyDate = DateTime.Now; 

    Este enfoque tiene varias ventajas:

    • te ahorra mucho trabajo de tipografía
    • no tiene que usar claves de sesión codificadas en su aplicación (por ejemplo, Session [“loginId”])
    • puede documentar los elementos de su sesión agregando comentarios de documentos XML sobre las propiedades de MySession
    • puede inicializar sus variables de sesión con valores predeterminados (por ejemplo, asegurando que no son nulos)

    Acceda a la sesión a través de los hilos HttpContext: –

     HttpContext.Current.Session["loginId"] 

    El problema con la solución sugerida es que puede romper algunas características de rendimiento integradas en el SessionState si está utilizando un almacenamiento de sesión fuera de proceso. (“Modo de servidor de estado” o “Modo de servidor de SQL”). En los modos oop, los datos de la sesión deben ser serializados al final de la solicitud de la página y deserializados al comienzo de la solicitud de la página, lo que puede ser costoso. Para mejorar el rendimiento, SessionState intenta solo deserializar lo que se necesita solo mediante la deserialización de la variable cuando se accede a ella por primera vez, y solo vuelve a serializar y reemplaza la variable que se modificó. Si tienes muchas variables de sesión y las insertas en una sola clase, esencialmente todo tu sesión se deserializará en cada solicitud de página que use la sesión y todo tendrá que ser serializado nuevamente aunque solo haya 1 propiedad modificada porque la clase ha cambiado. Algo a tener en cuenta si estás usando una gran cantidad de sesiones y un modo oop.

    Las respuestas presentadas antes de la mía proporcionan soluciones aptas para el problema, sin embargo, creo que es importante entender por qué se produce este error:

    La propiedad Session de la Page devuelve una instancia de tipo HttpSessionState relativa a esa solicitud particular. Page.Session es en realidad equivalente a llamar a Page.Context.Session .

    MSDN explica cómo esto es posible:

    Como las páginas ASP.NET contienen una referencia predeterminada al espacio de nombres System.Web (que contiene la clase HttpContext ), puede hacer referencia a los miembros de HttpContext en una página .aspx sin la referencia de clase totalmente calificada a HttpContext .

    Sin embargo, cuando intenta acceder a esta propiedad dentro de una clase en App_Code, la propiedad no estará disponible para usted a menos que su clase proceda de la clase de página.

    Mi solución a este escenario frecuente es que nunca paso objetos de página a las clases . Preferiría extraer los objetos necesarios de la sesión de página y pasarlos a la clase en forma de una colección de nombre-valor / matriz / lista, según el caso.

    Tuve el mismo error porque estaba tratando de manipular las variables de sesión dentro de una clase de sesión personalizada.

    Tuve que pasar el contexto actual (system.web.httpcontext.current) a la clase, y luego todo salió bien.

    MAMÁ

    Esto debería ser más eficiente tanto para la aplicación como para el desarrollador.

    Agregue la siguiente clase a su proyecto web:

     ///  /// This holds all of the session variables for the site. ///  public class SessionCentralized { protected internal static void Save(string sessionName, T value) { HttpContext.Current.Session[sessionName] = value; } protected internal static T Get(string sessionName) { return (T)HttpContext.Current.Session[sessionName]; } public static int? WhatEverSessionVariableYouWantToHold { get { return Get(nameof(WhatEverSessionVariableYouWantToHold)); } set { Save(nameof(WhatEverSessionVariableYouWantToHold), value); } } } 

    Aquí está la implementación:

     SessionCentralized.WhatEverSessionVariableYouWantToHold = id;