2010-11-15 27 views
13

Estoy usando VS2010 y he creado un asp simple. aplicación de formularios web, utilizando el servidor de desarrollo para probarlo.
Intento almacenar datos de usuario - consultados desde el servidor sql - en la sesión, ya que no quiero acceder a la base de datos en cada solicitud. Estoy usando los métodos 'Application_AuthenticateRequest' y 'Session_Start'.
Primera ronda: AuthenticateRequest llamado. Se ejecutó el siguiente código:¿Por qué HttpContext.Current.Session es nulo en Global.asax?

public static void Initialize(string login_name, bool force_refresh) 
    { 
     HttpSessionState Session = HttpContext.Current.Session; 
     object o = Session == null ? null : Session["EMPLOYEE_DATA"]; 
     if (force_refresh || o == null || o.GetType() != typeof(Employee) || (o as Employee).login_name!= login_name) 
     { 
     _current = UIManager.GetEmployee(login_name); 
     if (Session != null) 
     { 
      Session["EMPLOYEE_DATA"] = _current; 
     } 
     } 
     else 
     { 
     _current = (Employee)o; 
     } 
    } 

La variable _current es un campo privado estático publicado a través de una propiedad estática. En la primera ronda, la sesión es nula, y creo que está bien porque todavía no se ha llamado al Session_Start. El Session_Start se parece a esto:

protected void Session_Start(object sender, EventArgs e) 
{ 
    Session["EMPLOYEE_DATA"] = EmployeeFactory.Current; 
} 

En la siguiente ronda del Session_Start no se llama, por supuesto, pero en el AuthenticateRequest no puede acceder a la sesión. El HttpContext.Current.Session es nulo y el this.Session reference throw a HttpException dice que "El estado de la sesión no está disponible en este contexto".

Sin embargo, puedo acceder a la sesión desde cualquiera de los eventos page_load, pero es una mala práctica, creo que puse autenticación cada page_load. ¿Alguna idea de cómo puedo acceder a la sesión?

Gracias por el consejo,
Péter

Respuesta

32

usted no es capaz de utilizar la sesión en el Application_AuthenticateRequest becauase no está obligado en ese momento.

Creo que puede utilizar el evento Application_AcquireRequestState.

+0

+1 - No he leído la pregunta original lo suficientemente cerca. –

+0

Gracias. Fue la solución. –

+2

@ Torbjörn Hansson: A veces es nulo, ¿tienes alguna idea de por qué? – Homam

-1

intenta utilizar el código de abajo en Page_Load

Response.AppendHeader("Refresh", Convert.ToString(Session.Timeout * 15) + "; 
URL=SessionExpPage.aspx"); 
Cuestiones relacionadas