У меня проблема со статической переменной в 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, потому что он используется только в этом модуле/веб-форме и больше нигде.