Общая / статическая переменная в Global.asax изолирована для каждого запроса?

У меня есть несколько веб-служб ASP.NET, которые имеют общий вспомогательный класс, им нужно только создать экземпляр на сервер. Он используется для простого перевода данных, но при запуске тратит некоторое время на загрузку вещей из файла web.config и т. д. Вспомогательный класс на 100% потокобезопасен. Думайте об этом как о простой библиотеке вызовов служебных программ. Я бы сделал все методы, общие для класса, но я хочу загрузить начальную конфигурацию из web.config. Мы развернули веб-службы в IIS 6.0 и использовали пул приложений с веб-садом 15 рабочих.

Я объявил вспомогательный класс как частную общую переменную в Global.asax и добавил свойство Shared ReadOnly для отложенной загрузки следующим образом:

Private Shared _helper As MyHelperClass

Public Shared ReadOnly Property Helper() As MyHelperClass
    Get
        If _helper Is Nothing Then
            _helper = New MyHelperClass()
        End If
        Return _helper
    End Get
End Property

У меня есть код регистрации в конструкторе для MyHelperClass(), и он показывает, что конструктор работает для каждого запроса, даже в том же потоке. Я уверен, что мне просто не хватает некоторых ключевых деталей ASP.NET, но MSDN не очень помог.

Я пробовал делать аналогичные вещи, используя как Application("Helper"), так и Cache("Helper"), и я все еще видел, как конструктор запускается с каждым запросом.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
3 283
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Раньше я делал что-то подобное в собственном приложении, и это вызывало разные странные ошибки. Каждый пользователь будет иметь доступ ко всем остальным данным в собственности. Кроме того, вы можете столкнуться с тем, что один пользователь будет использовать его, а затем отключиться, потому что его запросил другой пользователь.

Никакого там не изолированного.

Вы можете поместить своего помощника в состояние приложения. Сделайте это в global.asax:

  void Application_Start(object sender, EventArgs e)
  {
    Application.Add("MyHelper", new MyHelperClass());
  }

Вы можете использовать Помощник таким образом:

  MyHelperClass helper = (MyHelperClass)HttpContext.Current.Application["MyHelper"];
  helper.Foo();

В результате получается единственный экземпляр класса MyHelperClass, который создается при запуске приложения и находится в состоянии приложения. Поскольку экземпляр создается в Application_Start, это происходит только один раз для каждого экземпляра HttpApplication, а не для каждого запроса.

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

Michael Haren 15.09.2008 17:38

Майкл - Я не думаю, что это будет создавать экземпляр нового объекта при каждом запросе. Объект создается при запуске приложения, всего один раз. Вторая часть просто присваивает объектной переменной, указывающей на существующий объект. За все время существует только 1 экземпляр объекта.

ingredient_15939 20.08.2011 14:48

ингридиент_15939 абсолютно прав. Один объект на приложение, а не один на запрос. Новый создается при каждом перезапуске приложения (например, после перезагрузки iisreset или сервера ...)

JRoppert 06.02.2012 18:33
Ответ принят как подходящий

Нецелесообразно использовать состояние приложения, если оно вам не требуется, все будет намного проще, если вы будете использовать объекты для каждого запроса. Любое добавление состояния к вспомогательным классам могло вызвать всевозможные незаметные ошибки. Используйте коллекцию элементов HttpContext.Current и инициализируйте ее для каждого запроса. Модуль VB будет делать то, что вы хотите, но вы не должны делать его с отслеживанием состояния.

Очень-очень плохая идея для дорогих объектов воссоздавать их для каждого запроса. Работает, если у вас сайт с низким трафиком, но убивает вас при большой нагрузке на сервер.

JRoppert 06.02.2012 18:34

Другие вопросы по теме