Подтвердить что ты не робот

Двойные домены приложений в приложении ASP.NET 4

У меня есть приложение ASP.NET, работающее на IIS 7 с несколькими доменами приложений, и я не могу понять, почему в одном процессе есть несколько доменов приложений. Я скопировал базу кода, и я не могу создать второй домен приложения. Возможно ли, что переработка не удалась?

  • Эти двойные домены будут сохраняться на некоторое время.
  • Если рециркуляция происходит из-за веб-конфигурации или двоичного изменения, оба домена приложения будут опускаться, а два новых будут запущены.
  • Эти серверы подвержены нескольким бинарным патчам и IISResets в день - иногда есть 2 домена, иногда только 1.
  • Веб-садоводство отключено.
  • Я обнаружил это, потому что в приложении присутствует таймер в приложении к базе данных, и однажды он заметил, что у сервера было два сердечных удара.

В windbg,! dumpdomain показывает мне следующий результат: (отфильтрован только показ имен доменов приложений):

Line 59: Name:               None
Line 66: Name:               None
Line 372: Name:               DefaultDomain
Line 460: Name:               /LM/W3SVC/1/ROOT/MyAppDomain-1-129882892717131250
Line 4437: Name:               /LM/W3SVC/1/ROOT/MyAppDomain-4-129285605131450579
4b9b3361

Ответ 1

  • Даже если вы не создаете AppDomain, библиотека, которую вы используете, может быть. Какие сторонние компоненты вы используете? У вас есть библиотеки Inversion of Control или Dynamic Proxy, которые могут быть ответственны? Здесь объяснение этого происходит с Замок.

  • Вы уверены, что приложение работает только в одном месте в IIS? Возможно, что несколько сайтов/приложений IIS работают с одними и теми же файлами. Это было бы согласуется с (1) получением вашей информации об отладке из db, а не с приложением, и (2) переработкой из-за редактирования web.config, последовательно приводящего к дублированию доменов. Если одно место чаще всего доступно, чем другое, это может объяснить, почему иногда бывает только один AppDomain.

  • Если вы используете динамическую компиляцию ASP.NET и функцию теневого копирования, ASP.NET иногда будет иметь несколько AppDomain s. Джим Шуберт написал статью под названием ASP.NET, AppDomains и теневое копирование, которая объясняет это более подробно, а также предлагает несколько предложений относительно как изменить web.config, чтобы настроить это. У него также есть полезный ответ на Прекратит ли приложение ASP.NET выполнять перезапись DLL? Теневое копирование можно отключить, установив <hostingEnvironment shadowCopyBinAssemblies="false" />.

Update

Я втянулся в блог Jim Schubert и закончил читать этот несвязанный пост на Разрешить только один экземпляр приложения .NET. Если все остальное не удается, вы можете использовать этот подход для обеспечения работы только одного экземпляра приложения.

Ответ 2

Можете взглянуть на ваш ApplicationHost.config.

посмотрите: maxProcesses он должен быть 1.

Кажется, ваш IIS запускает несколько рабочих процессов.

Ответ 3

Как показано в следующем ответе fooobar.com/questions/305698/... в другом потоке, похоже, среда выполнения ASP.NET хранит пул экземпляров HttpApplication (независимо от maxProcesses/Web Garden).

Я не знаю, возможно ли, или даже желательно, управлять этим пулом. Лучшей практикой может быть создание экземпляров всех приложений в событии Application_Start, которое должно запускаться только один раз для каждого приложения, а не один раз для объединенного экземпляра HttpApplication.

Ответ 4

Если несколько приложений IIS нацелены на один и тот же путь. AppDomain будет создан для такого приложения IIS, если приложение будет вызвано.

Например:

Если оба объекта нацелены на один и тот же путь, они по-прежнему считаются двумя различными приложениями и будут созданы два AppDomains.