Arhn - архитектура программирования

Статическая переменная, изменяющая значения в ASP.NET С#

У меня проблема со статической переменной в ASP.NET с использованием C#. Я объявляю переменную в веб-форме.

public partial class Logueado_Movimientos : System.Web.UI.Page
{
   static List<ExchangeItems> theList;

   protected void Page_Load(object sender, EventArgs e)
   {
      if (IsPostback) return;
      theList = GetListValues();
   }
}

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

ExchangeItems имеет свойство ID, которое возвращает идентификатор из базы данных для каждого предмета, подлежащего обмену. Метод GetListValues() вызывается только один раз при загрузке страницы. После этого пользователь может выбрать элементы для обмена, щелкнув флажок в GridView, выполнить дальнейшие проверки, и после всего этого есть кнопка «Печать и сохранение», которая печатает в PDF с помощью iTextSharp и отправляет статус обратно в базу данных.

После всех проверок товар дважды менялся в производстве. Например, товар 180 — это тот, который обменивается, но когда документ распечатывается и сохраняется, оказывается, что товар 103 — это тот, который обрабатывается. Все предыдущие проверки имеют идентификатор 180. Элемент 103 даже не был в списке с самого начала.

Теперь, проверив базу данных (SQL Server), мы обнаружили, что элемент 103 был сохранен через 10 минут после элемента 180. Мы используем функцию GetDate() для сохранения даты и времени. Кроме того, они были назначены разным клиентам двумя разными пользователями.

Возможно, эти 10 минут у пользователя уходит на обработку запроса, иногда они разговаривают по телефону с заказчиком. Это означает, что пользователь1 работает с элементом 180, а пользователь2 работает с элементом 103, используя один и тот же модуль/веб-форму. Поскольку переменная является статической, возможно ли, что оба пользователя влияют на информацию друг друга? Я объявляю это сейчас как «частный статический», просто из паранойи, но есть ли что-то еще, что я упускаю?

Примечание: переменная является статической, потому что обратная передача теряет свое значение, если она не объявлена ​​так. Его нет в переменной Session, потому что он используется только в этом модуле/веб-форме и больше нигде.

16.04.2015

  • Вы не можете этого сделать. Вам нужен сеанс или ViewState. 16.04.2015
  • в основном вы не тестировали с несколькими пользователями. используйте сеанс, а не статический, и даже это не лучшее решение 16.04.2015
  • @phil652, спасибо, я тоже с нетерпением жду возможности помочь вам. 16.04.2015
  • В настоящее время я считаю, что этот вопрос уже охвачен несколькими существующими вопросами вокруг C# использует static в вопросах/статьях ASP.Net. Если вы обнаружите, что дубликат, который я выбрал, не охватывает все / некоторые из ваших вопросов, обязательно обновите вопрос, чтобы было ясно, что он достаточно отличается (обязательно отредактируйте ссылку на текущий дубликат), или задайте новый вопрос о отсутствующая часть. 16.04.2015
  • @АлексейЛевенков. Не наткнулся на ответ, который вы даете, прежде чем я разместил вопрос. Возможно, стоило поискать дальше, но я не могу тратить на это слишком много времени. Нужен ответ быстро из-за того, что он уже в производстве. 16.04.2015

Ответы:


1

Поскольку переменная является статической, возможно ли, что оба пользователя влияют на информацию друг друга?

Да — статические переменные совместно используются сеансами. Приватность этого не меняет. Одним из вариантов может быть использование вместо этого переменной сеанса.

Session["theList"] = GetListValues();

Его нет в переменной Session, потому что он используется только в этом модуле/веб-форме и больше нигде.

Так? Нет ничего плохого в том, что данные сеанса не используются всем приложением.

16.04.2015
  • также GetListValues ​​будет вызываться несколько раз. только не на постбеке 16.04.2015
  • Ммммм.... Я действительно стараюсь избегать переменной Session. Со мной случилось так, что он теряет свою ценность. 16.04.2015
  • Да - если пул приложений перерабатывает переменные сеанса, они теряются (но статические переменные тоже). Единственный верный способ — хранить данные во ViewState. 16.04.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..