2009-03-07 24 views
143

He creado un archivo de clase en la carpeta App_Code en mi aplicación. Tengo una sesión variable de¿Cómo acceder a las variables de sesión de cualquier clase en ASP.NET?

Session["loginId"] 

Quiero tener acceso a estas variables de sesión en mi clase, pero cuando estoy escribiendo la siguiente línea a continuación, se produce un error

Session["loginId"] 

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

Respuesta

331

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

Pero por favor leyendo para tener mi primera respuesta ...


siempre uso una clase envoltura 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í mismo en la sesión ASP.NET y le permite acceder a sus propiedades de sesión de una manera de tipo seguro de 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:

  • le ahorra una gran cantidad de tipo de fundición a presión
  • que no tienen que utilizar claves de sesión no modificables a través de su aplicación (por ejemplo, Sesión [ "loginid"]
  • puede documentar sus artículos de sesión mediante la adición de comentarios documento XML en las propiedades de MySession
  • puede inicializar sus variables de sesión con valores por defecto (por ejemplo, asegurando que no son nulos)
+0

Hola, tenemos que escribir el código para get y set, ¿verdad? "public int LoginId {get; set;}" – Prashant

+0

Lo he escrito como: get {return Convert.ToString (HttpContext.Current.Session ["webm_login"]); } set {HttpContext.Current.Session ["webm_login"] = value; } – Prashant

+0

¿Es la forma correcta de obtener y establecer? – Prashant

96

acceder a la sesión a través de los hilos HttpContext: -

HttpContext.Current.Session["loginId"] 
+0

Gracias a ton Anthony por este simple paso. – Kings

+0

Muchas gracias Anthony, + 1 por eso –

+0

Gracias. Olvidé lo que era el espacio de nombres :) –

12

las respuestas se presentan antes que la mía proporcionan soluciones aptas para el problema, sin embargo, siento que es importante entender por qué estos resultados de error:

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

MSDN explica cómo es esto posible:

Debido a que las páginas ASP.NET contienen una referencia por defecto para el 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 al HttpContext.

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 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.

+0

Esa es una gran explicación, me ayudó +1 :) –

22

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.

+3

+1 para sacar esto. Si no está utilizando InProc para la sesión, entonces Ernie es 100% correcto. InProc es muy limitado de todos modos, ya que no admite webfarms y se perderá si la aplicación se reinicia. Tenga en cuenta que, por costo de rendimiento, estamos buscando un 20% de prima en el uso del modo de servidor de estado, y los costos de serialización se suman a eso. Como se puede imaginar, esto puede ser costoso. Puede evitar parte de la sobrecarga de serialización al apegarse a tipos primitivos (por ejemplo, int, string, char, byte, etc.). Los objetos personalizados se enfrentarán a la serialización. Cuidado con el usuario –

+0

+1 Buen punto. Un cambio que casaría los dos conceptos sería hacer que cada propiedad en esta clase personalizada de "sesión" llamara a la sesión asp.net en lugar de a un gran objeto en sesión. Tengo que hacer el tipo de conversión que el enfoque de @ M4N evita, pero quizás valga la pena si solo lees parte de la sesión cada vez. – eol

1

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.

MA

Cuestiones relacionadas