Ich habe eine .NET MVC-Webanwendung, die Zeit benötigt, um ordnungsgemäß herunterzufahren, und immer dann, wenn die IIS-Anwendungsdomäne wiederverwendet wird (dh eine neue Instanz wird hochgespielt und erhält alle neuen Anforderungen, während die alte Instanz auf ausstehende Anforderungen wartet Ich muss das Herunterfahren dieser App blockieren, bis der aktuelle Async-Hintergrund der App (der keine ausstehenden Anforderungen enthält) abgeschlossen ist. IRegisteredObject (siehe Ссылка ) bietet diese Blockierungsmöglichkeit, obwohl meine Prozesse immer zu Zeiten zu verschwinden scheinen, die nicht mit meiner Blockierungszeit und den IIS Einstellungen übereinstimmen.
Ich habe diesen Beitrag gesehen ( IRegisteredObject funktioniert nicht wie erwartet ), was die Wichtigkeit erklärt der IIS Shutdown Time Limit, aber während IRegisteredObject für eine bestimmte Zeit zu blockieren scheint, kann ich nicht die Blockierung für die gewünschte Zeit von 2 Stunden blockieren (auch kann ich im Allgemeinen keine Ergebnisse erhalten, die aufgrund verschiedener Einstellungen sinnvoll sind) / p>
Im Folgenden finden Sie eine einfache Implementierung von IRegisteredObject mit einem Hintergrundthread, den ich für Tests verwendet habe:
%Vor%In App Start starte ich die IRegisteredObject-Komponente:
%Vor%Schließlich habe ich beim Testen App-Domain-Recycles durch drei separate Mittel ausgelöst:
(1) Änderung der Web.config-Datei (ergibt einen HostingEnvironment.ShutdownReason-Wert von ConfigurationChange)
(2) Manuelle Wiederverwendung durch Klicken auf den Anwendungspool der Anwendung und dann Wiederverwendung im IIS-Manager (ergibt einen HostingEnvironment.ShutdownReason-Wert von HostingEnvironment)
(3) Zulassen, dass die App basierend auf der IIS-Einstellung unter Prozessmodell - "Leerlauf-Zeitlimit (Minuten)" automatisch recycelt wird (liefert auch einen HostingEnvironment.ShutdownReason-Wert von HostingEnvironment)
Ich hätte das nicht erwartet, aber die Art und Weise, in der das Recycling ausgelöst wird, scheint eine drastische Rolle zu spielen ... unten sind meine Ergebnisse durch Tests, bei denen ich die Mittel für Recycling und IIS-Einstellungen (Shutdown Limit und Idle Time) geändert habe -out).
Ergebnisse:
---- Web.config Änderung recycle (ShutdownReason: ConfigurationChange) ----
Nach dem Aufruf von IRegisteredObject (sofort: true) sehe ich in meinen Protokollen, dass die Hintergrundaufgabe fast genau so lange dauert wie für IIS Idle Time-Out, während das Shutdown Time Limit keine Rolle spielt. Bei dieser Wiederverwendung wird ferner unter der Annahme, dass das Leerlaufzeitlimit hoch genug eingestellt ist, die Wiederverwertungsblockierung immer eingehalten. Ich blockierte für einen ganzen Tag in einem Test, indem ich das Idle-Timeout auf 0 setzte (d. H. Aus).
---- IIS-Manager manuell recyceln (ShutdownReason: HostingEnvironment) ----
Nach dem Aufruf von IRegisteredObject (sofort: true) wird in den Protokollen genau das entgegengesetzte Verhalten im Vergleich zur Änderung von Web.config angezeigt. Egal, wie das Leerlauf-Timeout aussieht, die Blockierung scheint nicht betroffen zu sein. Umgekehrt gibt das Shutdown Time Limit vor, wie lange das Recycling (bis zu einem gewissen Punkt) blockiert werden soll. Von 1 Sekunde bis 5 Minuten wird der Recyclingvorgang basierend auf dieser Abschaltgrenze blockiert. Wenn die Einstellung jedoch höher oder ausgeschaltet ist, scheint die Blockierung an der Obergrenze von etwa 5 Minuten zu bleiben.
---- Automatischer Leerlauf-Timeout (ShutdownReason: HostingEnvironment) ----
Endlich etwas Vorhersagbares ... die automatische Wiederverwertung wird tatsächlich ausgelöst, basierend auf der Leerlauf-Zeitabschaltung, die dann eine ähnliche Situation wie im Fall des manuellen Recyclings verursacht: Shutdown Time Limit wird bis zu 5 Minuten, aber nicht länger als eingehalten Das. Vermutlich liegt dies daran, dass die automatischen und manuellen Wiederverwendungen jeweils die gleiche HostingEnvironment.ShutdownReason: HostingEnvironment aufweisen.
Ok ... Ich entschuldige mich für die Länge dieses! Wie Sie sehen, scheint die Kombination von Recycling-Methoden und IIS-Einstellungen einfach nicht zu den erwarteten Ergebnissen zu führen. Des Weiteren ist mein Ziel das alles in der Lage zu sein, für maximal zwei Stunden zu blockieren, was aus meinen Tests außerhalb des web.config-Recycling-Falles nicht möglich scheint, egal welche Einstellungen ich wähle .... Kann jemand bitte Was gibt es hier unter der Haube? Welche Rolle spielt ShutdownReason? Welche Rolle spielen diese IIS-Einstellungen?
Was fehlt mir hier im Grunde, und wie kann ich IRegisteredObject verwenden, um für längere Zeiträume zu blockieren, die durch automatische Wiederverwendungen verursacht werden?
Hier spielen zwei verschiedene Konzepte eine Rolle.
Anwendungsdomänen bieten eine Isolationsgrenze für Sicherheit, Zuverlässigkeit und Versionierung sowie für das Entladen von Assemblys. Anwendungspools definieren eine Gruppe von Webanwendungen, die sich einen oder mehrere Arbeitsprozesse teilen. Jeder Anwendungspool könnte eine oder mehrere Anwendungsdomänen hosten.
Der Anwendungspool kann auf folgende Arten wiederverwendet werden:
Die Anwendungsdomäne wird wiederverwendet, wenn Sie die Datei Web.config, Global.asax oder eine beliebige DLL im Ordner bin einer Anwendung berühren.
IRegisteredObject kann den Prozess der Anwendungsdomäne entladen abfangen, hat jedoch keine Kontrolle über den Anwendungspool -Recycle. Wenn der Anwendungspool-Recycling ausgelöst wird, wird der w3wp.exe-Prozess beendet, neu gestartet und alle mit dem Anwendungspool verbundenen Anwendungsdomänen werden beendet.
Dies sollte erklären, warum Ihr IRegisteredObject erwartungsgemäß funktionierte, als Sie Ihre Web.config-Datei berührten, aber nicht die erwarteten Aktionen ausführen würde, wenn Sie den Anwendungspool rezykliert hätten. Wenn Ihr Inaktivitätszeitlimit oder Herunterfahrtimeout kürzer ist als das Zeitfenster, das Ihr IRegisteredObject die Anwendungsdomäne beibehält, nachdem eine Anwendungsdomänenwiederverwendung ausgelöst wurde, versucht das IRegisteredObject, die Anwendungsdomäne am Leben zu erhalten, aber wenn das Inaktivitätszeitlimit oder der Zeitlimit für Herunterfahren erreicht, der Anwendungspool wird wiederverwendet und die Anwendungsdomäne wird unabhängig von IRegisteredObject beendet.
Eine Lösung für Ihr Problem besteht darin, die Zeitlimiteinstellungen für Inaktivitätszeitlimit und Herunterfahren für den Anwendungspool zu deaktivieren und sich auf eine alternative Methode zur Wiederverwendung Ihres Anwendungspools zu verlassen. In diesem Fall wird Ihr Anwendungspool nicht automatisch wiederverwendet und Sie können sich darauf verlassen, dass Ihr IRegisteredObject die Anwendungsdomäne am Leben erhält.