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

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

Я объявил вспомогательный класс как переменную Private Shared в 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"), и я все еще видел, как конструктор запускался с каждым запросом.

Ответы [ 3 ]

3 голосов
/ 15 сентября 2008

Вы можете поместить своего помощника в состояние приложения. Сделайте это в 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, а не для каждого запроса.

0 голосов
/ 15 сентября 2008

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

0 голосов
/ 15 сентября 2008

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

Нет, там не изолированы.

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