2010-11-15 8 views
13

Sto usando VS2010 e ho creato un semplice asp. applicazione di moduli Web, utilizzando Development Server per testarlo.
Cerco di memorizzare i dati utente - interrogati dal server sql - nella sessione, dal momento che non desidero accedere al database in ogni richiesta. Sto usando i metodi 'Application_AuthenticateRequest' e 'Session_Start'.
Primo round: AuthenticateRequest chiamato. Il seguente codice ha funzionato:Perché HttpContext.Current.Session è null in 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 variabile _current è un campo statico privato pubblicato attraverso una proprietà statica. Nel primo round la Sessione è nullo, e penso che sia ok perché il Session_Start non è stato ancora chiamato. Il Session_Start assomiglia a questo:

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

Nel prossimo turno il Session_Start non è chiamato, naturalmente, ma nel AuthenticateRequest che non può accedere alla sessione. HttpContext.Current.Session è null e il riferimento this.Session lancia una HttpException dice che "lo stato della sessione non è disponibile in questo contesto".

Tuttavia, posso accedere alla sessione da qualsiasi evento page_load ma è una cattiva pratica. Penso di aver inserito l'autenticazione ogni page_load. Qualche idea su come posso accedere alla Sessione?

Grazie per la consulenza,
Péter

risposta

32

non sei in grado di utilizzare sessione sul Application_AuthenticateRequest becauase non è legato in quel momento.

Penso che tu sia in grado di utilizzare l'evento Application_AcquireRequestState.

+0

+1 - non ho letto la domanda iniziale abbastanza da vicino. –

+0

Grazie. Era la soluzione. –

+2

@ Torbjörn Hansson: A volte è nulla, hai qualche idea del perché? – Homam

-1

tenta di utilizzare il codice qui sotto in Page_Load

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