Область применения статической переменной в многопользовательском веб-приложении ASP.NET
Сохраняют ли статические переменные свои значения в сеансах пользователя?
У меня есть веб-приложение ASP.NET, где у меня есть две кнопки. Один для установки значения статической переменной, другой для отображения значения статической переменной.
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);
}
}
}
Хотя это работает в однопользовательской среде, что произойдет, если одновременно два пользователя вошли в систему с двух компьютеров, Пользователь 1 устанавливает значение 100, а затем Пользователь 2 устанавливает значение 200. После этого пользователь 1 вызывает кнопку "Получить значение". Что он увидит в качестве ценности?
4 ответа
Сохраняют ли статические переменные свои значения в сеансах пользователя?
Да, именно поэтому вы должны быть ОЧЕНЬ осторожны при использовании статических переменных в веб-приложении. Вы столкнетесь с проблемами параллелизма, поскольку более одного потока, обслуживающего запрос, может изменить значение переменной.
Хотя это работает в однопользовательской среде, что произойдет, если одновременно два пользователя вошли в систему с двух компьютеров, Пользователь 1 устанавливает значение 100, а затем Пользователь 2 устанавливает значение 200. После этого пользователь 1 вызывает кнопку "Получить значение". Что он увидит в качестве ценности?
Пользователь увидит 200 впоследствии.
Область действия статических переменных - уровень приложения.
Если вы храните что-то в статических переменных, значит, вы делаете что-то не так.
Если один пользователь сохранит данные, то же самое время другой пользователь получит доступ к той же странице, затем он также получит те же данные. Так что лучше хранить значения в сессиях.
Это будет работать для вас (имейте в виду, вам нужно обрабатывать нулевые значения /-1):
public static int customerID
{
get { return session["customerID"] == null? -1 : (int)session["customerID"]; }
set { session["customerID"] = value; }
}
Не используйте static для свойства, тогда оно работает:
public int customerID
{
get { return Session["customerID"] == null? -1 : (int)Session["customerID"]; }
set { Session["customerID"] = value; }
}