Um ehrlich zu sein, habe ich versucht, einen schmutzigen Trick mit IIS zu machen, und als ich dachte, ich würde damit durchkommen, wurde mir klar, dass meine Problemumgehung nicht funktioniert. Folgendes habe ich versucht:
1) Ich habe eine ASP.NET-Anwendung mit einer Preloader- Klasse, die IProcessHostPreloadClient erbt und die gesamte umfangreiche Initialisierung bei der Implementierung der Preload- Methode durchführt (die Anwendung ist komplex und Teil eines riesigen Systems, sodass etwa 2 Minuten erforderlich sind, um Verbindungen zu allen erforderlichen Verbindungen herzustellen Dienste und einige Unity-Registrierungen vorab instanziieren).
2) Ich habe eine Menge Arbeit, die beim Herunterfahren der Anwendung erledigt werden muss (Abbestellen, Trennen, Entsorgen, ...), und ich denke, der beste Ort dafür ist die * Application_End * -Methode in Global.asax .
3) Alles funktioniert einwandfrei, wenn ich Benutzeraktivität habe (die erste Anforderung nach dem Start des Anwendungspools, der die oben genannte Webanwendung enthält, führt dazu, dass * Application_Start * aufgerufen wird und anschließend * Application_End * beim Stoppen oder Recyceln des Anwendungspools aufgerufen wird), aber Probleme Tritt auf, wenn keine Benutzeraktivität vorliegt und die Anwendung versucht, sich nach 48 Stunden Aktivität neu zu starten (konfigurierte Anforderung). Da es keine Anfragen gab, wurde die Bewerbung offiziell nicht gestartet. Ergo kann es nicht ordnungsgemäß gestoppt werden, da * Application_End * nicht aufgerufen wird.
4) Jetzt kommt der unordentliche Teil ... Ich habe versucht, am Ende der Preload- Methode eine GET-Anfrage aus dem Code zu stellen , und es hat funktioniert. Aber diese Lösung schien mir schlecht, obwohl sie funktionierte. Also habe ich viele Dinge ausprobiert und das Letzte, was ich versucht habe, war Folgendes:
SimpleWorkerRequest swr = new SimpleWorkerRequest(string.Empty, string.Empty, tw);
HttpRuntime.ProcessRequest(swr);
... und das hat seinen Zweck erfüllt. * Application_Start * wurde aufgerufen (ich habe die Antwort überprüft, sie enthielt die Anmeldeseite, die bei der ersten Anforderung angezeigt werden sollte), und beim Herunterfahren des Anwendungspools wurde die Anwendung ordnungsgemäß beendet, indem die erforderlichen Arbeiten in * Application_End * ausgeführt wurden.
ABER
Nachdem die Anwendung auf diese Weise gestartet (vorinstalliert und initiiert) wurde, geschah Folgendes, als ich die Anwendung über einen Webbrowser erreichen wollte:
HTTP-Fehler 500.21 - Interner Server-Fehlerbehandler "ExtensionlessUrlHandler-Integrated-4.0" hat ein fehlerhaftes Modul "ManagedPipelineHandler" in seiner Modulliste
Ich kann das nicht herausfinden. Kann mir jemand sagen, warum dies passiert und wie man es behebt?
Wenn ich das nicht herausfinde, werde ich zur ersten Lösung zurückkehren (GET-Anfrage vom Code senden), aber dieses Problem wird mich nerven, da ich nicht einmal eine Idee habe, was falsch ist.