Предотвращение повторного использования IIS рабочих процессов для отдельных доменов приложений ASP.Net - PullRequest
3 голосов
/ 21 сентября 2010

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 26 сентября 2010

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

0 голосов
/ 21 сентября 2010

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

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

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

...