2013-01-04 25 views
40

Biến tĩnh có giữ lại giá trị của chúng trong các phiên người dùng không?Phạm vi Biến tĩnh trong ứng dụng web ASP.NET nhiều người dùng

Tôi có ứng dụng web ASP.NET nơi tôi có hai nút. Một để đặt giá trị biến tĩnh, một giá trị khác cho Hiển thị giá trị biến tĩnh.

namespace WebApplication1 
{ 

public partial class WebForm1 : System.Web.UI.Page 
{ 
    public static int customerID; 

    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    protected void ButtonSetCustomerID_Click(object sender, EventArgs e) 
    { 
     customerID = Convert.ToInt32(TextBox1.Text); 
    } 

    protected void ButtonGetCustomerID_Click(object sender, EventArgs e) 
    { 
     Label1.Text = Convert.ToString(customerID); 
    } 
} 

} 

Trong khi các công trình này trong môi trường người dùng đơn, Điều gì xảy ra nếu có 2 người dùng đồng thời đăng nhập từ hai máy tính, dùng 1 bộ giá trị như 100, sau đó tài khoản 2 bộ giá trị như 200. sau khi người dùng 1 gọi nút Nhận giá trị. Anh ta sẽ thấy gì làm giá trị?

+0

Xem câu hỏi/câu trả lời của tôi: https://stackoverflow.com/questions/12642136/asp-net-static-classes-and-asp-net-sessions – BlueChameleon

Trả lời

57

Biến tĩnh có giữ lại giá trị của chúng trong các phiên người dùng không?

Vâng, đó là lý do tại sao bạn nên cẩn thận khi bạn sử dụng biến tĩnh trong ứng dụng web. Bạn sẽ chạy trong các vấn đề tương tranh khi nhiều hơn một thread phục vụ một yêu cầu có thể sửa đổi giá trị của biến.

Trong khi các công trình này trong môi trường người dùng đơn, Điều gì xảy ra nếu có 2 người dùng đồng thời đăng nhập từ hai máy tính, dùng 1 bộ giá trị như 100, sau đó tài khoản 2 bộ giá trị như 200. sau đó người dùng 1 gọi nút Nhận giá trị. Anh ta sẽ thấy gì làm giá trị?

Người dùng sẽ thấy 200 sau đó.

19

Phạm vi biến tĩnh là cấp ứng dụng.

Nếu bạn lưu trữ thứ gì đó trong biến tĩnh, khi đó bạn đang làm điều sai trái.

Nếu một người dùng lưu dữ liệu, Cùng lúc một người dùng khác truy cập vào cùng một trang thì họ cũng sẽ nhận được cùng một dữ liệu. Vì vậy, tốt hơn bạn có thể lưu trữ các giá trị trong Phiên.

+0

các biến Session có thể được cấu hình để sử dụng bộ nhớ không? Tôi có một tình huống mà một người tiêu dùng api không lưu trữ hoặc lấy cookie và tôi không muốn một cơ sở dữ liệu hit, nó cho một cái gì đó xảy ra nhiều lần một giây. –

1

Điều này sẽ làm việc cho bạn (lưu ý, bạn cần phải xử lý các giá trị null/-1):

public static int customerID 
{ 
    get { return session["customerID"] == null? -1 : (int)session["customerID"]; } 
    set { session["customerID"] = value; } 
} 
+4

Bạn không thể truy cập trực tiếp các biến phiên dưới dạng "Phiên" từ trình truy cập nhận hoặc đặt tĩnh. Bạn cần sử dụng HttpContext.Current.Session để thay thế. –

+0

@StanShaw +1 .... –

-1

Không sử dụng tĩnh cho bất động sản sau đó nó hoạt động:

public int customerID 
{ 
    get { return Session["customerID"] == null? -1 : (int)Session["customerID"]; } 
    set { Session["customerID"] = value; } 
} 
Các vấn đề liên quan