Подтвердить что ты не робот

Статические переменные ASP.NET С# являются глобальными?

Сегодня я выпустил небольшое бета-приложение asp.net, которое позволяет внутреннему персоналу изменять информацию о продукте. Мы начали сталкиваться с проблемами, когда пользователи переписывали информацию о других продуктах... хотя каждый сотрудник редактировал совершенно другую строку (Продукт).

После некоторого поиска в google, я думаю, что знаю, что происходит, его использование с использованием статических переменных ниже - быстрый пример проблемы:

// EditProductGroup.aspx.cs
public partial class EditProductGroup : System.Web.UI.Page
{

    private static int _groupId = 0;

    protected void Page_Load(object sender, EventArgs e)
    {
      _groupId = Convert.ToInt16(Request.QueryString["GroupID"]);

     // get existing ProductGroup information from database using 
     //_groupId to find the row and populate textboxes
    }

    private void saveProductGroupData()
    {
      // when user hits 'save changes' button, update row 
      //where the primary key column 'ProductGroupID' matches _groupId in the table
    }
}

Таким образом, согласно моим исследованиям, статическая переменная фактически существует для приложения в целом, это означает, что если несколько пользователей используют приложение, они будут эффективно читать одно и то же "значение" для "_groupId", а в некоторых которые фактически устанавливают его на другое значение, что приводит к тому, что другой экземпляр пользователя страницы сохраняет данные в неправильной строке (ProductGroupId).

Мое намерение состояло в том, что статическая переменная изолирована от других пользователей и не должна интуитивно - каждый пользователь имеет свой собственный экземпляр страницы, таким образом, свой собственный экземпляр переменной _groupId.

К счастью, все это происходило в базе данных dev/staging, а не в live db. Я не уверен, нужно ли мне просто отказаться от ключевого слова "статические", чтобы остановить переменную, устанавливаемую/прочитанную всеми.

Любые мысли? Благодаря

4b9b3361

Ответ 1

Да, в ASP.NET время жизни статических полей для домена приложения (обратите внимание, что это немного отличается от общих типов).

Я бы рекомендовал использовать сеанс сервера для хранения данных, которые вы хотите связать с экземпляром сеанса браузера клиента (логин пользователя). т.е.

Session["_groupID"] = Convert.ToInt16(Request.QueryString["GroupID"]);

вы можете получить его, выполнив:

short groupID = Convert.ToInt16(Session["_groupID"]);

Ответ 2

Неверно сказать, что статическая переменная существует в широком применении. Они фактически существуют на двух разных уровнях.

  • Для не-генерических типов существует одна статическая переменная для AppDomain
  • Для типичных типов есть один экземпляр для каждого экземпляра AppDomain

Приложение может содержать много AppDomains и верно для нескольких типов приложений.

Если вы хотите сохранить пользовательские настройки, используйте переменную сеанса.

Ответ 3

Статические переменные имеют такое же время жизни, как и область приложения, в которой они были созданы. Поэтому, если вы получаете некоторые неправильные значения, это может быть некоторые проблемы в логике приложения или еще. Вы должны использовать SessionState для данных для каждого пользователя.