Wie eine ASP.NET-Anwendung wieder neu gestartet wird, wenn die web.config geändert wird?
-
03-07-2019 - |
Frage
Ich bin Hosting der ASP.NET-Laufzeit über die ApplicationHost.CreateApplicationHost
Methode. Wenn ich die web.config
ändern, während die Anwendung ausgeführt wird, sehe ich viele erste Chance ThreadAbortException
s geworfen. Dies ist direkt vor meiner Bewerbung nach unten kommt abstürzt. Ich gehe davon aus das ist, weil die Laufzeit Änderungen an der Konfiguration erkannt und will neu zu starten.
Das ist nicht wirklich ein unterstütztes Szenario für uns, also ich würde es vorziehen, wenn ich nur das automatische Nachladen ausschalten könnte.
Wer weiß, wie dies zu tun?
Lösung
Soweit ich bin mir bewusst, gibt es keine Möglichkeit, dieses Verhalten zu deaktivieren, Änderungen an den webconfig die Anwendung zwingen, neu gestartet werden.
Update: Es ist tatsächlich möglich, gibt es eine Reihe von Methoden, gut dokumentiert, wie in dieser Antwort erklärt *
Original Antwort:
Es gibt eine ähnliche Frage hier nur für andere Referenz. Ich fand zusätzliche Informationen, die hilfreich sein können.
UrsacheKonfigurationsänderungen einen Neustart der Anwendungsdomäne
Änderungen Konfigurationseinstellungen in Web.config Dateien verursachen indirekt die Anwendung Domäne neu zu starten. Dieses Verhalten tritt von Entwurf. Sie können optional Verwenden Sie die configSource Attribut Referenz externe Konfigurationsdateien dass verursachen keinen Neustart, wenn ein Änderung vorgenommen wird. Für mehr Informationen, siehe configSource in Allgemeine Attribute Geerbt von Abschnitt Elementen.
* Disclaimer: Ich schrieb die andere Antwort und würde normalerweise keine Selbstreferenz machen, aber es relevant genug zu verbinden hier seit 8 Jahren nach diesem Beitrag es ist wirklich ganz anders finden: Eine Lösung ist sehr einfach durch klicken durch das IIS-Front-End und Abhilfen gibt es seit ASP.NET 1.0.
Andere Tipps
Eigentlich sind die ersten beiden Antworten nicht korrekt. Es ist möglich und ganz einfach, dieses Recycling zu verhindern, und diese Funktion ist seit mindestens IIS6 zur Verfügung.
Methode 1 (System breit)
Ändern Sie den DWORD
Registrierungseinstellung für HKLM\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\FCNMode
auf den Wert 1
, die deaktivieren wird alle Dateiänderungsbenachrichtigungen.
Sie sich nicht von der Stelle zu verwechseln. Wow6432Node
hat in diesem Fall keinen Einfluss auf die Bitness Ihrer Web-Anwendung
Methode 2 (.NET 4.5 +)
Wenn Sie .NET 4.5 verwenden, dann ist es nun möglich, diese auf einem deaktivieren pro-Site-Ebene , einfach den folgenden in Ihrem web.config
verwenden:
<httpRuntime fcnMode="Disabled"/>
Methode 3 (IIS6 +)
Schließlich, und auch (zumindest) um seit IIS6, gibt es eine Einstellung DisallowRotationOnConfigChange
als Einstellung nur für den Anwendungspool genannt (zumindest das ist, was ich denke, der Text auf MSDN zu sagen versucht, aber ich habe es nicht getestet). Setzen Sie ihn auf true
und Änderungen an der Konfiguration des Anwendungspools werden in einer sofortigen Rückführung zur Folge haben.
Diese letzte Einstellung kann auch von erweiterten Einstellungen des Anwendungspools eingestellt werden:
Methode 4 (ASP.NET 1.0 und 1.1)
(alte) Webseiten mit ASP.NET 1.0 oder 1.1, gibt es einen bestätigten Bug , die eine schnelle und wiederholte rezykliert Dateiänderungen verursachen können. Die Abhilfe zu der Zeit war ähnlich zu dem, was MartinHN unter der Hauptfrage vorgeschlagen, nämlich so etwas wie die folgenden in Ihrem web.config
:
<compilation
debug="false"
defaultLanguage="vb"
numRecompilesBeforeAppRestart="5000">
Das nicht deaktiviert Recycling, aber es tut dies erst nach 5000 Neukompilierungen stattgefunden hat. Ob diese Zahl ist nützlich, hängt von der Größe Ihrer Anwendung. Microsoft sagt nicht klar, was für ein Neuübersetzung wirklich ist. Die Standardeinstellung ist aber 15 .
Als Nebenwirkung: unabhängig von der Version von .NET oder Windows, finden wir, dass, wenn die Anwendung von einer Freigabe ausgeführt wird und in einer Umgebung mit Lastenausgleich verwendet wird, dass die Website kontinuierlich rezykliert. Der einzige Weg, um es zu lösen, fügen hinzu, dass FNCMode
Einstellung in die Registrierung (aber jetzt gibt es mehr feinkörnige Option).
Ich lief in einem noch größeren Problem auf der gleichen Linie - Änderungen an jeder Datei oder Unterordner in der AppDomain Basisverzeichnis der Hosting-Umgebung zur Abschaltung führen. Das ist ein ziemlich großes Problem für unsere Anwendung, da wir eine WPF-Benutzeroberfläche in derselben AppDomain laufen und wir können es nicht neu starten, ohne den Benutzer distruptive zu sein.
Ich wollte unbedingt vermeiden, einen separaten AppDomain für den Web-basierten Teil der Anwendung auszuführen, die so tat ich mit Reflektor einige graben. Ich fand, dass der Täter war die interne Klasse FileChangesMonitor
.
Also schrieb ich eine schreckliche schreckliche Reflexion hacken, das Problem zu lösen. Ich dachte, ich poste würde es hier als mögliche Lösung für jemand anderes das gleiche Problem. Sie müssen nur HttpInternals.StopFileMonitoring()
rufen Herunterfahren auf Datei / Ordner-Änderungen zu deaktivieren.
internal static class HttpInternals
{
private static readonly FieldInfo s_TheRuntime = typeof(HttpRuntime).GetField("_theRuntime", BindingFlags.NonPublic | BindingFlags.Static);
private static readonly FieldInfo s_FileChangesMonitor = typeof(HttpRuntime).GetField("_fcm", BindingFlags.NonPublic | BindingFlags.Instance);
private static readonly MethodInfo s_FileChangesMonitorStop = s_FileChangesMonitor.FieldType.GetMethod("Stop", BindingFlags.NonPublic | BindingFlags.Instance);
private static object HttpRuntime
{
get
{
return s_TheRuntime.GetValue(null);
}
}
private static object FileChangesMonitor
{
get
{
return s_FileChangesMonitor.GetValue(HttpRuntime);
}
}
public static void StopFileMonitoring()
{
s_FileChangesMonitorStop.Invoke(FileChangesMonitor, null);
}
}
Eine Lösung wäre folgendes Element web.config Abschnitt wird hinzufügen:
<httpRuntime
waitChangeNotification="315360000"
maxWaitChangeNotification="315360000"
/>
Wie bereits erwähnt durch jfburdet die Lösung WaitChangeNotification und MaxWaitChangeNotification verwenden.
Dass gesagt wird, sollten Sie wissen, dass sie nicht funktionieren auf IIS 7, wenn ASP.NET im gemischten Modus ausgeführt wird: http://forums.iis.net/t/1149344.aspx