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



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





  • Recycle The AppDomain : выгрузите AppDomain и загрузите новый AppDomain в тот же процесс (например, когда HttpRuntime.UnloadAppDomain() вызывается, когда web.конфигурация изменена).


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


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



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



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

718   2  

2 ответов:

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

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

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

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

Comments

    Ничего не найдено.