Вопрос по c#, asp.net, static – aspx обеспечивает специальную обработку для статических переменных c #

3

В веб-приложении .net есть что-то особенное в страницах .aspx и коде c # позади страниц, которые изменяют поведение статических переменных.

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

более подробное изложение вопроса было бы следующим: если у меня есть два веб-сеанса a и b, запущенные на одном и том же сервере iis в одном пуле приложений, если a обращается к рассматриваемой странице и устанавливает статическую переменную x в значение1, а затем b обращается к на той же странице и устанавливает статическую переменную x в значение 2, я понимаю, что значение1 было заменено значением 2. Моя дилемма состоит в том, что этот шаблон используется в коде неоднократно, на высоком уровне код, кажется, работает. вывод заключается в том, что это либо удача (время, так как в сеансе а отказалась от потребности в переменной до того, как сеанс b достигнет ее), либо происходит что-то еще.

Я открыт для предложений, будь то нюанс C # или ошибка разработчика.

Это просто удача :) podiluska

Ваш Ответ

1   ответ
3

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

Тем не менее, их значения действительно совместно используются в приложении ASP.Net, если у них нет отдельного механизма поддержки, какSession.

Example
public static int UserId = 10; // BAD! everyone gets/sets this field's value

// BAD! everyone gets/sets this property's implicit backing value
public static int UserId {
     get;
     set;
}

// This case is fine; just a shortcut to avoid instantiating an object.
// The backing value is segregated by other means, in this case, Session.
public static int UserId{
    get{
        return (int)HttpContext.Current.Session["UserId"];
    }
}

// While I would question doing work inside a property getter, the fact that 
// it is  static won't cause an issue; every call retrieves data from a 
// database, not from a single memory location.
public static int UserId{
    get{
        // return some value from database
    }
}

Вы можете не увидеть проблему, пока трафик не будет значительным. Предположим, что страница извлекает значение, помещает его в статическую переменную, использует его один раз, а затем завершает выполнение. Если страница выполняется быстро, существует только очень небольшое (но опасное!) Окно перекрытия, которое вы можете не увидеть, если не выберете правильное время и / или трафик не будет достаточно высоким.

Это может привести к трудно диагностируемым ошибкам, поскольку они зависят от времени, и вы, вероятно, не увидите их при самостоятельном тестировании на локальном компьютере.

это то, что я думал, и я ценю проверку. Похоже, у меня есть целая куча очистки кода, чтобы сделать :) dan-

Похожие вопросы