2010-11-15 54 views
13

J'utilise VS2010 et j'ai créé un ASP simple. application de formulaires Web, en utilisant Development Server pour le tester.
J'essaie de stocker les données utilisateur - interrogées depuis le serveur SQL - dans la session, car je ne veux pas accéder à la base de données dans chaque requête. J'utilise les méthodes 'Application_AuthenticateRequest' et 'Session_Start'.
Premier tour: AuthenticateRequest appelé. Le code suivant a été exécuté:Pourquoi HttpContext.Current.Session est null dans 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 est un champ statique privé publié via une propriété statique. Au premier tour, la session est nulle, et je pense que c'est ok parce que le Session_Start n'est pas encore appelé. Le Session_Start ressemble à ceci:

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

Au prochain tour du Session_Start n'est pas appelé bien sûr, mais dans le AuthenticateRequest je ne peux pas accéder à la session. La HttpContext.Current.Session est null et la référence this.Session renvoie une exception HttpException indique que "l'état de la session n'est pas disponible dans ce contexte".

Cependant, je peux accéder à la session à partir de l'un des événements page_load mais c'est une mauvaise pratique que je pense que je mets l'authentification chaque page_load. Une idée comment puis-je accéder à la session?

Merci pour les conseils,
Péter

Répondre

32

Vous n'êtes pas en mesure d'utiliser session sur le Application_AuthenticateRequest becauase il est pas lié à ce moment-là.

Je pense que vous pouvez utiliser l'événement Application_AcquireRequestState.

+0

+1 - Je ne l'ai pas lu la question initiale assez près. –

+0

Merci. C'était la solution. –

+2

@ Torbjörn Hansson: Parfois, c'est nul, avez-vous une idée pourquoi? – Homam

-1

essayez d'utiliser le code ci-dessous dans Page_load

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