Szczerze mówiąc, próbowałem rzucić brudną sztuczkę na IIS i kiedy pomyślałem, że mi się to uda, zdałem sobie sprawę, że moje obejście nie działa. Oto, co próbowałem zrobić:
1) Mam aplikację ASP.NET, która ma klasę Preloader, która dziedziczy IProcessHostPreloadClient i wykonuje całą ciężką inicjalizację w implementacji metody Preload (aplikacja jest złożona i stanowi część ogromnego systemu, więc ustanowienie połączeń ze wszystkimi niezbędnymi elementami zajmuje około 2 minut usługi i wstępnie zarejestrować niektóre rejestracje Unity).
2) Mam dużo pracy, którą należy wykonać przy zamykaniu aplikacji (anulowanie subskrypcji, rozłączenie, usunięcie, ...), i chyba najlepszym miejscem do tego jest metoda * Application_End * znajdująca się w Global.asax .
3) Wszystko działa dobrze, gdy mam aktywność użytkownika (pierwsze żądanie po uruchomieniu puli aplikacji zawierającej wspomnianą aplikację internetową spowoduje wywołanie * Application_Start *, a następnie * Application_End * zostanie wywołane przy zatrzymaniu lub recyklingu puli aplikacji), ale problemy występuje, gdy nie ma aktywności użytkownika, a aplikacja próbuje się zrestartować po 48 godzinach aktywności (skonfigurowane wymaganie). Ponieważ nie było żadnych żądań, aplikacja oficjalnie się nie rozpoczęła. Ergo, nie można go z wdziękiem zatrzymać, ponieważ * Application_End * nie zostanie wywołane.
4) Teraz pojawia się bałagan ... Próbowałem wysłać żądanie GET z kodu na końcu metody Preload i zadziałało. Ale to rozwiązanie wydawało mi się złe, mimo że zadziałało. Próbowałem wielu rzeczy, a ostatnią rzeczą, jakiej próbowałem, było:
SimpleWorkerRequest swr = new SimpleWorkerRequest(string.Empty, string.Empty, tw);
HttpRuntime.ProcessRequest(swr);
... i to spełniło swój cel. Wywołano * Application_Start * (sprawdziłem odpowiedź, zawierała stronę logowania, która miała być wyświetlana w początkowym żądaniu), a aplikacja zamykania puli aplikacji zakończyła się z wdziękiem wykonując niezbędną pracę w * Application_End *.
ALE
Po uruchomieniu aplikacji (wstępnie załadowanym i zainicjowanym) w ten sposób stało się to, gdy chciałem uzyskać dostęp do aplikacji za pośrednictwem przeglądarki internetowej:
Błąd HTTP 500.21 - Wewnętrzny moduł obsługi błędów serwera „ExtensionlessUrlHandler-Integrated-4.0” ma zły moduł „ManagedPipelineHandler” na liście modułów
Nie jestem w stanie tego rozgryźć. Czy ktoś może mi powiedzieć, dlaczego tak się dzieje i jak to naprawić?
Jeśli tego nie rozwiążę, wrócę do pierwszego rozwiązania (wysyłanie żądania GET z kodu), ale ten problem mnie popsunie, ponieważ nawet nie mam pojęcia, co jest nie tak.