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
+1 - Nie czytałem oryginalnego pytanie dość ściśle. –
Dziękuję. To było rozwiązanie. –
@ Torbjörn Hansson: Czasami jest nieważny, czy masz jakiś pomysł, dlaczego? – Homam