Двойные домены приложений в приложении 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
Ответы
Ответ 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.