Честно говоря, я попытался превратить грязный трюк в IIS, и когда я подумал, что мне это удастся, я понял, что мое обходное решение не работает. Вот что я пытался сделать:
1) У меня есть приложение ASP.NET, у которого есть класс Preloader, который наследует IProcessHostPreloadClient и выполняет всю тяжелую инициализацию в реализации метода Preload (приложение является сложным и является частью огромной системы, поэтому для установления соединений со всеми необходимыми службами требуется примерно 2 минуты и предварительная регистрация некоторых записей Unity).
2) У меня есть много работы, которая должна быть выполнена при завершении работы приложения (отмена подписки, отключение, удаление,...), и я думаю, что лучшее место для этого - это метод * Application_End *, расположенный в Global.asax.
3) Все работает очень хорошо, когда у меня есть активность пользователя (первый запрос после пула приложений, который содержит вышеупомянутое веб-приложение, будет вызван вызовом * Application_Start *, а затем * Application_End * вызывается при запуске или переработке пула приложений), но проблемы возникают, когда нет активности пользователя, и приложение пытается перезапустить себя после того, как оно было активным в течение 48 часов (настроенное требование). Поскольку запросов не было, заявка официально не началась. Ergo, он не может быть изящно остановлен, так как * Application_End * не будет вызываться.
4) Теперь идет грязная часть... Я попытался сделать запрос GET из кода в конце метода Preload, и он сработал. Но это решение показалось мне плохой, хотя это сработало. Итак, я пробовал много вещей, и последнее, что я пробовал, было следующим:
SimpleWorkerRequest swr = new SimpleWorkerRequest(string.Empty, string.Empty, tw);
HttpRuntime.ProcessRequest(swr);
... и это сделало это. * Был вызван Application_Start * (я проверил ответ, он содержал страницу входа, которая должна отображаться в первоначальном запросе), и приложение приложения останова приложения закончилось изящно, выполнив необходимую работу в * Application_End *.
НО
После запуска приложения (предварительно загруженного и инициированного) таким образом, это произошло, когда я захотел обратиться к приложению через веб-браузер:
Ошибка HTTP 500.21 - Внутренняя ошибка сервера Обработчик "ExtensionlessUrlHandler-Integrated-4.0" имеет плохой модуль "ManagedPipelineHandler" в своем списке модулей
Я не могу понять это. Может кто-нибудь сказать мне, почему это происходит и как это исправить?
Если я этого не понимаю, я вернусь к первому решению (отправив запрос GET из кода), но эта проблема будет ошибкой, так как у меня даже нет идеи, что неправильно.