tag - ¿Qué debo hacer si la sesión actual de ASP.NET es nula?
tag helper asp net core 2 (4)
La siguiente declaración no es del todo precisa:
"Así que si está llamando a otra funcionalidad, 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í here , puede solucionar el problema con un atributo simple en el método o utilizar 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 de la siguiente manera:
[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 de sesión nulo, y es más probable que se ejecute en excepciones de referencia nulas al intentar acceder al objeto de sesión.
Gracias a Matthew Cozier por la solución.
Solo pensé que agregaría mis dos centavos.
Ed
En mi aplicación web, hago algo como esto para leer las variables de la sesión:
if (HttpContext.Current.Session != null && HttpContext.Current.Session["MyVariable"] != null)
{
string myVariable= (string)HttpContext.Current.Session["MyVariable"];
}
Entiendo por qué es importante comprobar por qué HttpContext.Current.Session ["MyVariable"] es nulo (la variable podría no haber sido almacenada en la sesión aún o la sesión se ha restablecido por varias razones), pero ¿por qué debo verificarlo? si HttpContext.Current.Session
es nulo?
Según entiendo, la sesión la crea automáticamente 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?
}
Sí, el objeto Session puede ser nulo, pero solo en ciertas circunstancias, con las que rara vez se encontrará:
- Si ha deshabilitado el módulo http de SessionState , deshabilitar todas las sesiones
- 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 null repetidamente. Sin embargo, es algo en lo que pensar si está desarrollando un IHttpModule o si no está abajo en los detalles más gruesos de ASP .NET.
Editar
En respuesta al comentario: si el estado de sesión está o no disponible depende de si el evento AcquireRequestState se ha ejecutado para la solicitud. Aquí es donde funciona el módulo de estado de la sesión 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 transfiera 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 sesión no esté disponible. Todo se reduce a si hay una solicitud actual y se ha ejecutado AcquireRequestState.
Además, si el cliente ha desactivado las cookies, el objeto Session aún estará disponible, pero en la siguiente solicitud, el usuario regresará con una nueva sesión vacía. Esto se debe a que el cliente recibe una bolsa de estado de sesión si aún no tiene una. 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.
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 #):
public class MyAshxClass : IHttpHandler, IRequiresSessionState
RESUMEN: en ASP.NET, cada página web se deriva de la clase System.Web.UI.Page. La clase de página agrega una instancia del objeto HttpSession para los datos de la sesión. La clase de página expone diferentes eventos y métodos para la personalización. En particular, el método OnInit se usa para establecer el estado de inicialización del objeto Página. Si la solicitud no tiene la cookie de sesión, se emitirá una nueva cookie de sesión para el solicitante.
EDITAR:
Sesión: un concepto para principiantes
RESUMEN: la sesión se crea cuando el usuario envía una primera solicitud al servidor para cualquier página en la aplicación web, la aplicación crea la sesión y envía la ID de sesión nuevamente al usuario con la respuesta y se almacena en la máquina cliente como una pequeña cookie . Entonces, idealmente, la "máquina que ha desactivado las cookies, la información de la sesión no se almacenará".