2010-11-15 14 views
13

Używam VS2010 i stworzyłem prosty bol. aplikacja formularzy internetowych, za pomocą programu Development Server do testowania.
Próbuję przechowywać dane użytkownika - zapytanie z serwera sql - w sesji, ponieważ nie chcę mieć dostępu do bazy danych w każdym żądaniu. Używam metod "Application_AuthenticateRequest" i "Session_Start".
Pierwsza runda: AuthenticateRequest wywołana. Poniższy kod ran:Dlaczego HttpContext.Current.Session ma wartość null w pliku 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; 
     } 
    } 

Zmienna _current jest prywatnym polem statycznym opublikowane przez właściwości statyczne. W pierwszej rundzie sesja ma wartość zerową i myślę, że jest w porządku, ponieważ sesja Session_Start nie jest jeszcze wywoływana. session_start wygląda następująco:

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

W następnej rundzie session_start nie nazywa się oczywiście, ale w AuthenticateRequest nie mogę uzyskać dostęp do sesji. HttpContext.Current.Session ma wartość NULL, a odwołanie this.Session generuje wyjątek HttpException, który mówi, że "Stan sesji nie jest dostępny w tym kontekście".

Mogę jednak uzyskać dostęp do sesji z dowolnego zdarzenia page_load, ale jest to zła praktyka. Uważam, że umieszczam uwierzytelnianie co page_load. Każdy pomysł, w jaki sposób mogę uzyskać dostęp do sesji?

Dzięki za radę,
Péter

Odpowiedz

32

Nie jesteś w stanie wykorzystać sesji na Application_AuthenticateRequest becauase nie jest związana w tym momencie.

Myślę, że jesteś w stanie użyć zdarzenia Application_AcquireRequestState.

+0

+1 - Nie czytałem oryginalnego pytanie dość ściśle. –

+0

Dziękuję. To było rozwiązanie. –

+2

@ Torbjörn Hansson: Czasami jest nieważny, czy masz jakiś pomysł, dlaczego? – Homam

-1

spróbować użyć poniższy kod w page_load

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