2010-11-15 101 views
13

我使用VS2010並創建了一個簡單的asp。 Web表單應用程序,使用Development Server進行測試。
我試圖存儲用戶數據 - 從SQL Server查詢 - 在會話中,因爲我不想在每次請求訪問數據庫。我正在使用'Application_AuthenticateRequest'和'Session_Start'方法。
第一輪: AuthenticateRequest調用。下面的代碼運行:爲什麼Global.asax中的HttpContext.Current.Session爲null?

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; 
     } 
    } 

的_current變量是通過一個靜態屬性出版了一本私人靜態字段。 在第一輪會話是空的,我認爲沒關係,因爲Session_Start還沒有被調用。 將在session_start看起來是這樣的:

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

下一輪的在session_start不叫,當然,但在AuthenticateRequest我無法訪問會話。 HttpContext.Current.Session爲null,並且this.Session引用引發HttpException,表示「會話狀態在此上下文中不可用」。

但是我可以從任何在Page_Load事件的訪問會話,但它是一個不好的做法,我認爲,我把每一個認證的Page_Load。 任何想法如何訪問會話?

謝謝你的建議,
彼得

回答

32

becauase它沒有在那一刻約束你不能使用會話的Application_AuthenticateRequest。

我覺得你可以使用事件Application_AcquireRequestState。

+0

+1 - 我沒看過原題不夠緊密。 – 2010-11-15 15:49:04

+0

謝謝。這是解決方案。 – 2010-11-15 16:05:49

+2

@TorbjörnHansson:有時候它是空的,你知道爲什麼嗎? – Homam 2011-07-17 19:35:32

-1

嘗試使用下面的代碼在Page_Load中

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