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 ThreadAbortExceptions 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?

War es hilfreich?

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.

  Ursache

Konfigurationsä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.

Diese MSDN Artikel

* 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:

Disable Recycling für Konfigurationsänderung

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top