Solución:
Sí, el objeto Session puede ser nulo, pero solo en determinadas circunstancias, con las que rara vez se encontrará:
- Si ha deshabilitado el módulo http SessionState, deshabilitar las sesiones por completo
- Si su código se ejecuta antes del evento HttpApplication.AcquireRequestState.
- Su código se ejecuta en un IHttpHandler, que no especifica la interfaz IRequiresSessionState o IReadOnlySessionState.
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 nulo repetidamente. Sin embargo, es algo en lo que pensar si está desarrollando un IHttpModule o si no está en los detalles más valientes 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 que se entregue 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 que realizan la lógica de inicialización durante el inicio, por ejemplo, en el evento Application_Start o mediante el uso de un constructor estático, es posible que el estado de la sesión no esté disponible. Todo se reduce a si hay una solicitud actual y si se ha ejecutado AcquireRequestState.
Además, si el cliente ha desactivado 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 carpeta de estado de sesión si aún 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 entregará una nueva sesión una y otra vez.
La siguiente declaración no es del todo precisa:
“Por lo tanto, si está llamando a otras funciones, incluidas las clases estáticas, desde su página, debería estar bien”
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 del servicio web:
Sin embargo, hay un truco, para acceder al estado de la sesión dentro de un método web, debe habilitar la administración del estado de la sesión así:
[WebMethod(EnableSession = true)]
Al especificar el valor de EnableSession, ahora tendrá una sesión administrada para jugar. Si no especifica este valor, obtendrá un objeto Session nulo, y lo más probable es que se encuentre con excepciones de referencia nula al intentar acceder al objeto de sesión.
Gracias a Matthew Cozier por la solución.
Solo pensé en agregar mis dos centavos.
Ed
Si su instancia de sesión es nula y está en un archivo ‘ashx’, simplemente implemente la interfaz ‘IRequiresSessionState’.
Esta interfaz no tiene miembros, por lo que solo necesita agregar el nombre de la interfaz después de la declaración de clase (C #):
public class MyAshxClass : IHttpHandler, IRequiresSessionState