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