2010-04-05 12 views
51

Tôi đang sử dụng asp.net pagemethods với jQuery .... Làm thế nào để có được giá trị của một biến session bên trong phương thức tĩnh trong C#?Làm thế nào tôi có thể nhận được giá trị của một biến phiên trong một phương thức tĩnh?

protected void Page_Load(object sender, EventArgs e) 
{ 
    Session["UserName"] = "Pandiya"; 
} 
[WebMethod] 
public static string GetName() 
{ 
    string s = Session["UserName"].ToString(); 
    return s; 
} 

Khi tôi biên dịch này, tôi nhận được lỗi:

An object reference is required for the non-static field, method, or property 'System.Web.UI.Page.Session.get'`

Bất kỳ đề nghị hay bất kỳ thay thế?

+0

sử dụng HttpContext.Current như thế này: HttpContext.Current.Session [ "UserName"] ToString();. –

Trả lời

84

HttpContext.Current.Session["..."]

HttpContext.Current giúp bạn hiện tại ... tốt, Http Bối cảnh; từ đó bạn có thể truy cập: Phiên, Yêu cầu, Phản hồi, v.v.

+0

@ jwwishart ya nó đã hoạt động ... Nhưng tại sao lại như vậy? –

+1

HttpContext.Current cung cấp cho bạn quyền truy cập vào ngữ cảnh Http hiện tại như được giải thích trong bản chỉnh sửa tôi vừa làm. Thuộc tính HttpContext.Current là tĩnh (http://msdn.microsoft.com/en-us/library/system.web.httpcontext_members.aspx) và nó thực hiện phép thuật và trả về cho bạn HttpContext hiện tại. Bạn phải có quyền truy cập vào hầu hết nội dung bạn có quyền truy cập vào mã phía sau, v.v. – jwwishart

+0

P.S. Bạn đang cố gắng truy cập một thuộc tính không tĩnh (thuộc tính Session) thông qua một phương thức tĩnh ... rõ ràng là nó (thuộc tính Session) chỉ tồn tại trên một cá thể của lớp! Hy vọng điều này giải thích mọi thứ tốt hơn? – jwwishart

16

Nếu bạn chưa thay đổi chủ đề, bạn có thể sử dụng HttpContext.Current.Session, như được chỉ ra bởi jwwishart.

HttpContext.Current trả lại ngữ cảnh được liên kết với chuỗi. Rõ ràng điều này có nghĩa là bạn không thể sử dụng nó nếu bạn đã bắt đầu một chủ đề mới, ví dụ. Bạn có thể cũng cần xem xét sự nhanh nhẹn của luồng - Yêu cầu ASP.NET không phải lúc nào cũng thực thi trên cùng một luồng cho toàn bộ yêu cầu. Tôi tin rằng rằng ngữ cảnh được truyền bá một cách thích hợp, nhưng đó là điều cần ghi nhớ.

Mặt khác, tôi không chắc chắn liệu bạn có còn một phiên cho Phương thức trang AJAX hay không. Bạn có thể thử nó, nhưng tôi sẽ hơi lo lắng về nó. Lý tưởng nhất là bạn nên vượt qua tất cả thông tin bạn cần từ khách hàng thay thế.

2

Hãy thử điều này:

HttpContext.Current.Session["UserName"].ToString();