2010-11-15 48 views
13

Tôi đang sử dụng VS2010 và tạo ra một asp đơn giản. ứng dụng biểu mẫu web, sử dụng Máy chủ phát triển để kiểm tra nó.
Tôi cố gắng lưu trữ dữ liệu người dùng - được truy vấn từ máy chủ sql - trong phiên, vì tôi không muốn truy cập cơ sở dữ liệu trong mọi yêu cầu. Tôi đang sử dụng phương thức 'Application_AuthenticateRequest' và 'Session_Start'.
Vòng đầu tiên: AuthenticateRequest được gọi. Mã sau chạy:Tại sao HttpContext.Current.Session là null trong 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; 
     } 
    } 

Biến _current là trường tĩnh riêng được xuất bản qua thuộc tính tĩnh. Trong vòng đầu tiên, Session là null, và tôi nghĩ rằng nó ok vì Session_Start chưa được gọi. session_start trông như thế này:

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

Trong vòng tiếp theo session_start không được gọi tất nhiên nhưng trong AuthenticateRequest tôi không thể truy cập vào phiên. HttpContext.Current.Session là null và tham chiếu this.Session ném một HttpException nói rằng "Session state không có sẵn trong ngữ cảnh này".

Tuy nhiên tôi có thể truy cập Phiên từ bất kỳ sự kiện page_load nào nhưng thực tế là tôi nghĩ rằng tôi đặt xác thực mỗi page_load. Bất kỳ ý tưởng nào tôi có thể truy cập vào Phiên làm việc như thế nào?

Cảm ơn lời khuyên,
Péter

Trả lời

32

Bạn không thể sử dụng phiên trên Application_AuthenticateRequest becauase nó không bị ràng buộc vào thời điểm đó.

Tôi nghĩ bạn có thể sử dụng sự kiện Application_AcquireRequestState.

+0

+1 - Tôi không đọc những câu hỏi ban đầu đủ chặt chẽ. –

+0

Cảm ơn bạn. Đó là giải pháp. –

+2

@ Torbjörn Hansson: Đôi khi nó là null, bạn có bất kỳ ý tưởng tại sao không? – Homam

-1

cố gắng sử dụng mã dưới đây vào Page_Load

Response.AppendHeader("Refresh", Convert.ToString(Session.Timeout * 15) + "; 
URL=SessionExpPage.aspx"); 
Các vấn đề liên quan