Честно говоря, я попытался сделать грязную уловку с IIS, и когда я подумал, что мне это сойдет с рук, я понял, что мой обходной путь не работает. Вот что я пытался сделать:
1) У меня есть приложение ASP.NET , который имеет Preloader класс , который наследует IProcessHostPreloadClient и делает все инициализацию тяжелый в натяг реализации метода (приложение является сложным , и это является частью огромной системы, поэтому она требует около 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 из кода), но эта проблема вызовет у меня ошибку, так как я даже не представляю, в чем дело.