2011-07-06 29 views
9

Este problema parece estar relacionado con la publicación this, pero no he podido inferir una solución del hilo.FormsAuthentication.SignOut throwing NullReferenceException

me di cuenta de este código en una aplicación que heredé (después de tomar nota en un archivo de registro que estaba siendo comido una excepción):

protected void Session_End(object sender, EventArgs e) 
    { 
     try 
     { 
      FormsAuthentication.SignOut(); 
      FormsAuthentication.RedirectToLoginPage(); 
      //if (this.Context.Handler is IRequiresSessionState || this.Context.Handler is IReadOnlySessionState) 
      //{ 
      // FormsAuthentication.SignOut(); 
      // FormsAuthentication.RedirectToLoginPage(); 
      //} 
     } 
     catch (Exception ex) 
     { 
      this.GetType().GetLogger().Error(ex); 
     } 
    } 

Me pregunto algunas cosas. En primer lugar, ¿cómo está lanzando SignOut una excepción de referencia nula? ¿Es un caso excepcional, o estoy haciendo algo inherentemente malo en mi programa? Luego, ¿con qué debería estar probando para evitar esta excepción antes de lanzarla?

15: 51: 57,288 [13] ERROR ASP.global_asax - System.NullReferenceException: Referencia de objeto no establecida en una instancia de un objeto. en System.Web.Security.FormsAuthentication.SignOut() en MvcApplication.Session_End

Gracias

Respuesta

14

Es importante darse cuenta de que Session_End no quede necesariamente ejecutados en el contexto de una petición HTTP. Se puede ejecutar cuando una sesión expira. No puede enviar nada al cliente en ese momento, porque simplemente ya no está allí.

En consecuencia, no debe intentar eliminar la cookie de autenticación de formularios en Session_End. Si lo desea, debe hacerlo antes, cuando haga clic en el botón "Cerrar sesión" en algún lugar de su aplicación. Si necesita que un ticket de autenticación de formularios del usuario caduque después de un tiempo de espera, simplemente debe establecer el tiempo de caducidad de la cookie de manera apropiada (posiblemente equivalente al valor de tiempo de espera de la sesión) en el archivo de configuración.

+0

Ahh ... He leído algo parecido, pero no lo entendí hasta que lo leí de otra forma. ¿Es eso decir que debería estar validando contra la existencia de HttpContext.Current, o que comer el mensaje de error es un medio aceptable de manejar la "aleatoriedad" de cuando Session_End se dispara? –

+0

@Sean Debe usar 'Session_End' para eliminar la cookie de autenticación. Tiene un propósito diferente y solo puedes asumir que tienes acceso a las cosas del lado del servidor en ese contexto. Además, ¿por qué necesitarías eso en primer lugar? Si desea que caduque la cookie, simplemente deje que expire configurando su tiempo de espera. –

+0

Lee tu edición. Gracias. –

Cuestiones relacionadas