Область применения статической переменной в многопользовательском веб-приложении 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; }
}
Другие вопросы по тегам