En mi aplicación web, hago algo como esto para leer las variables de sesión:
if (HttpContext.Current.Session != null && HttpContext.Current.Session["MyVariable"] != null)
{
string myVariable= (string)HttpContext.Current.Session["MyVariable"];
}
Entiendo por qué es importante verificar por qué HttpContext.Current.Session ["MyVariable"] es nulo (es posible que la variable aún no se haya almacenado en la sesión o que la sesión se haya restablecido por varias razones), pero ¿por qué debo verificarla? si HttpContext.Current.Session
es nulo?
Entiendo que la sesión es creada automáticamente por ASP.NET, por lo tanto, HttpContext.Current.Session nunca debe ser nulo. ¿Es correcta esta suposición? Si puede ser nulo, ¿significa que también debería verificarlo antes de almacenar algo en él?
if (HttpContext.Current.Session != null)
{
HttpContext.Current.Session["MyVariable"]="Test";
}
else
{
// What should be done in this case (if session is null)?
// Is it possible to force the session to be created if it doesn't exist?
}
Respuestas:
Sí, el objeto Session puede ser nulo, pero solo en ciertas circunstancias, con las que rara vez se encontrará:
Si solo tiene código en las páginas, no se encontrará con esto. La mayor parte de mi código ASP .NET usa Session sin verificar null repetidamente. Sin embargo, es algo en lo que pensar si está desarrollando un IHttpModule o si no está en los detalles más valiosos de ASP .NET.
Editar
En respuesta al comentario: si el estado de la sesión está disponible o no depende de si el evento AcquireRequestState se ha ejecutado para la solicitud. Aquí es donde el módulo de estado de sesión hace su trabajo leyendo la cookie de sesión y encontrando el conjunto apropiado de variables de sesión para usted.
AcquireRequestState se ejecuta antes de entregar el control a su página. Entonces, si está llamando a otra funcionalidad, incluidas las clases estáticas, desde su página, debería estar bien.
Si tiene algunas clases haciendo lógica de inicialización durante el inicio, por ejemplo en el evento Application_Start o mediante el uso de un constructor estático, el estado de la sesión podría no estar disponible. Todo se reduce a si hay una solicitud actual y se ha ejecutado AcquireRequestState.
Además, si el cliente ha deshabilitado las cookies, el objeto Sesión seguirá estando disponible, pero en la próxima solicitud, el usuario volverá con una nueva Sesión vacía. Esto se debe a que el cliente recibe una bolsa de estado de sesión si todavía no la tiene. Si el cliente no transporta la cookie de sesión, no tenemos forma de identificar al cliente como el mismo, por lo que se le dará una nueva sesión una y otra vez.
fuente
HttpContext.Current.Session
puede ser nulo para codificar en `Application_AcquireRequestState '. Sin embargo, la solicitud de la página en sí hace que el objeto de sesión esté disponible para codificar allí. Esto está bajo MVC.NET 4 al menos.La siguiente declaración no es del todo precisa:
Estoy llamando a un método estático que hace referencia a la sesión a través de HttpContext.Current.Session y es nulo. Sin embargo, estoy llamando al método a través de un método de servicio web a través de ajax usando jQuery.
Como descubrí aquí , puede solucionar el problema con un atributo simple en el método o usar el objeto de sesión de servicio web:
Gracias a Matthew Cozier por la solución.
Solo pensé en agregar mis dos centavos.
Ed
fuente
the default value is false
. Funciona de maravilla.Si su instancia de sesión es nula y está en un archivo 'ashx', simplemente implemente la interfaz 'IRequiresSessionState'.
Esta interfaz no tiene ningún miembro, por lo que solo necesita agregar el nombre de la interfaz después de la declaración de clase (C #):
fuente
Artículos técnicos de ASP.NET
EDITAR:
Sesión: un concepto para principiantes
fuente
En mi caso
ASP.NET State Service
fue detenido. Cambio de laStartup type
queAutomatic
e iniciar el servicio manualmente por primera vez resuelto el problema.fuente