Запретить IIS повторно использовать рабочие процессы для отдельных доменов приложений ASP.Net

Когда IIS перезапускает веб-приложение ASP.Net (2.0), он может:

  • Переработайте домен приложения: выгрузите домен приложения и загрузите новый домен приложения в том же процессе (например, когда вызывается HttpRuntime.UnloadAppDomain(), когда изменяется web.config).
  • Повторное использование процесса: выгрузите домен приложения и загрузите новый в новый процесс (например, при вызове команды «Повторное использование» в пуле приложений через inetmgr или при достижении предела памяти).

По некоторым внутренним причинам (проблемы с устаревшим нативным кодом, от которого мы зависим), мы не можем позволить первый вариант. Мы просто не можем загрузить приложение дважды в одном и том же процессе.

Можно ли каким-то образом сказать IIS, чтобы он никогда не разрешал повторное использование рабочего процесса?

Я сам пытался предотвратить это, отслеживая, запускалось ли приложение в процессе один раз с использованием Mutex, и если да, то генерируя исключение во время Application_Start()); Я также пробовал завершить процесс, вызвав Environment.Exit() во время Application_End(). Проблема с обоими методами заключается в том, что они приводят к сбою любых запросов, поступающих во время Application_End или Application_Start (в отличие от ручного перезапуска процесса, при котором не происходит абсолютно никаких сбоев запросов, потому что они сразу же перенаправляются на новый процесс).


person Yodan Tauber    schedule 21.09.2010    source источник


Ответы (2)


Я считаю, что «Recycle the AppDomain» входит в предварительную версию среды выполнения ASP.NET, и IIS на самом деле нигде не задействован (я не уверен на 100% в этом случае в случае интегрированного конвейера IIS7). Поэтому я не думаю, что то, что вы хотите, возможно. Но есть несколько обходных путей, которые вы можете рассмотреть для своей проблемы:

  1. Убедитесь, что вы запускаете код запуска (манипулирование устаревшим кодом) только один раз - это должно быть возможно через named system семафоры. После того, как системный семафор создается при запуске приложения в рабочем процессе, он будет существовать до тех пор, пока процесс не будет переработан, поэтому вы можете выполнить инициализацию каждого процесса.

  2. Если вариант №1 невозможен, рассмотрите возможность размещения кода, управляющего устаревшим кодом, в отдельном процессе - этот процесс может предоставлять соответствующие функции через службы WCF по именованным каналам. ASP.NET использует их для использования устаревшего кода.

person VinayC    schedule 21.09.2010
comment
Во-первых, спасибо за ответ. №2, к сожалению, невозможно из-за поздних стадий проекта. Я пробовал №1 с системным мьютексом, но проблема - person Yodan Tauber; 22.09.2010
comment
* но я не думал об пропуске инициализации (я думал только о блокировке дополнительных запусков в том же процессе, но это приводило к сбою некоторых первых запросов). Я попытаюсь. - person Yodan Tauber; 22.09.2010
comment
К сожалению, вариант №1 также оказался невозможным (невозможно пропустить инициализацию, потому что некоторые из них действительно необходимы после перезапуска приложения). - person Yodan Tauber; 26.09.2010

Не удалось найти способ сообщить IIS, что рабочие процессы не должны использоваться повторно. Не могу позволить себе исправить основную проблему, которая запрещает повторное использование процесса. Следовательно, в конечном итоге вызов Environment.Exit(0) в Application_End, хотя это может привести к сбою небольшого количества запросов при сбросе соединения.

person Yodan Tauber    schedule 26.09.2010