(Actualizado para completar)
Puede acceder a las variables de sesión desde cualquier página o control usando Session["loginId"]
y desde cualquier clase (por ejemplo, desde dentro de una biblioteca de clases), usandoSystem.Web.HttpContext.Current.Session["loginId"].
Pero sigue leyendo para obtener mi respuesta original ...
Siempre uso una clase contenedora alrededor de la sesión ASP.NET para simplificar el acceso a las variables de 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, e.g like this:
public string Property1 { get; set; }
public DateTime MyDate { get; set; }
public int LoginId { get; set; }
}
Esta clase almacena una instancia de sí misma en la sesión ASP.NET y le permite acceder a las propiedades de su sesión de forma segura desde cualquier clase, por ejemplo, así:
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 salva de muchos tipos de fundición
- no tiene que usar claves de sesión codificadas en toda su aplicación (por ejemplo, Sesión ["loginId"]
- puede documentar los elementos de su sesión agregando comentarios de documentos XML en las propiedades de MySession
- puede inicializar sus variables de sesión con valores predeterminados (por ejemplo, asegurarse de que no sean nulos)
Acceda a la sesión a través de los hilos HttpContext: -
fuente
El problema con la solución sugerida es que puede romper algunas características de rendimiento integradas en SessionState si está utilizando un almacenamiento de sesión fuera de proceso. ("Modo de servidor de estado" o "Modo de servidor SQL"). En los modos oop, los datos de la sesión deben ser serializados al final de la solicitud de página y deserializados al comienzo de la solicitud de página, lo que puede ser costoso. Para mejorar el rendimiento, SessionState intenta solo deserializar lo que se necesita solo deserializar la variable cuando se accede por primera vez, y solo vuelve a serializar y reemplaza la variable que se modificó. Si tiene muchas variables de sesión y las inserta en una sola clase, esencialmente todo en su sesión se deserializará en cada solicitud de página que use la sesión y todo deberá ser serializado nuevamente, incluso si solo se modificó 1 propiedad porque la clase cambió. Solo algo a tener en cuenta si estás usando mucha sesión y un modo oop.
fuente
Las respuestas presentadas antes que las mías proporcionan soluciones adecuadas al problema, sin embargo, creo que es importante entender por qué se produce este error:
La
Session
propiedad dePage
devuelve una instancia de tipo enHttpSessionState
relación con esa solicitud en particular.Page.Session
en realidad es equivalente a llamarPage.Context.Session
.MSDN explica cómo esto es posible:
Sin embargo, cuando intente acceder a esta propiedad dentro de una clase en App_Code, la propiedad no estará disponible para usted a menos que su clase se derive de la Clase de página.
Mi solución a este escenario frecuente es que nunca paso objetos de página a clases . Preferiría extraer los objetos requeridos de la página Sesión y pasarlos a la Clase en forma de una colección de valores de nombre / Array / List, según el caso.
fuente
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Á
fuente
En asp.net core esto funciona de manera diferente:
Fuente: https://benjii.me/2016/07/using-sessions-and-httpcontext-in-aspnetcore-and-mvc-core/
fuente
Esto debería ser más eficiente tanto para la aplicación como para el desarrollador.
Agregue la siguiente clase a su proyecto web:
Aquí está la implementación:
fuente