2013-01-04 25 views
40

靜態變量是否在用戶會話中保留其值?多用戶ASP.NET Web應用程序中靜態變量的範圍

我有一個ASP.NET Web應用程序,我有兩個按鈕。一個用於設置靜態變量值,另一個用於顯示靜態變量值。

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

} 

雖然這部作品在單用戶環境中,會發生什麼事,如果有2個用戶同時從兩臺電腦,用戶1臺價值爲100,則用戶2臺的用戶後值200登錄1調用Get Value按鈕。他認爲價值是什麼?

+0

見我的問題/答案:https://stackoverflow.com/questions/12642136/asp-net-static-classes-and-asp-net-sessions – BlueChameleon

回答

57

靜態變量是否在用戶會話中保留其值?

是的,這就是爲什麼在Web應用程序中使用靜態變量時應該非常小心。由於請求的多個線程可以修改變量的值,因此您將在併發問題中運行。

雖然這部作品在單用戶環境中,會發生什麼事,如果有 2個用戶同時從兩臺電腦,用戶登錄1套 值爲100,然後用戶2套後該值作爲200。用戶1 調用Get Value按鈕。他認爲價值是什麼?

用戶以後會看到200個。

19

靜態變量範圍是應用程序級別。

如果你在靜態變量中存儲了某些東西,那麼你做錯了事情。

如果一個用戶保存數據,同時另一個用戶訪問同一頁面,那麼他也會得到相同的數據。因此,您可以更好地將值存儲在會話中。

+0

會話變量可以配置爲使用內存?我有一種情況,api消費者不會存儲或檢索cookie,我不希望數據庫受到攻擊,因爲它每秒會發生多次事件。 –

1

這會爲你工作(記住,你需要處理空值/ -1):

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

您無法直接從靜態獲取或設置訪問器以「會話」的形式訪問會話變量。您需要改爲使用HttpContext.Current.Session。 –

+0

@StanShaw +1 .... –

-1

不要爲物業使用靜態然後它的工作原理:

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