Dies ist zurückzuführen auf FileChangesNotifications.
Das passiert seit ASP.NET 2.0. Wenn Sie einen Ordner innerhalb einer Anwendung löschen, wird wird neu gestartet . Sie können es selbst sehen, indem Sie ASP.NET Zustandsüberwachung .
Fügen Sie einfach diesen Code in Ihre web.config/configuration/system.web ein:
<healthMonitoring enabled="true">
<rules>
<add name="MyAppLogEvents" eventName="Application Lifetime Events" provider="EventLogProvider" profile="Critical"/>
</rules>
</healthMonitoring>
Danach besuchen Sie Windows Log -> Application
. Was ist hier los?
Wenn Sie einen Ordner löschen, sollte es einen Unterordner geben, Delete(path, true)
löscht zuerst den Unterordner. Das reicht aus, damit FileChangesMonitor von der Entfernung erfährt und Ihre Anwendung herunterfährt. In der Zwischenzeit ist Ihr Hauptverzeichnis noch nicht gelöscht. Dies ist das Ereignis aus Log:
![enter image description here]()
Delete()
seine Arbeit nicht beendet hat und weil die Anwendung heruntergefahren wird, löst sie eine Ausnahme aus:
![enter image description here]()
Wenn Sie keine Unterordner haben in einem Ordner, den Sie löschen, löscht Delete() einfach alle Dateien und den Ordner, die Anwendung wird auch neu gestartet, aber Sie keine Ausnahmen erhalten denn der Neustart der Anwendung unterbricht nichts. Dennoch gehen alle laufenden Sitzungen verloren, die App reagiert beim Neustart nicht auf Anfragen usw.
Was nun?
Es gibt einige Umgehungsmöglichkeiten und Optimierungen, um dieses Verhalten zu deaktivieren, Verzeichnis Junction , Ausschalten von FCN mit der Registry , Anhalten von FileChangesMonitor mit Reflection (da es keine exponierte Methode gibt) aber sie scheinen nicht alle richtig zu sein, denn der FCN ist nicht ohne Grund da. Er kümmert sich um Struktur Ihrer Anwendung was nicht der Fall ist Struktur Ihrer Daten . Die kurze Antwort lautet: Legen Sie die Ordner, die Sie löschen möchten, außerhalb Ihrer Anwendung ab. FileChangesMonitor wird keine Benachrichtigungen erhalten und Ihre Anwendung wird nicht jedes Mal neu gestartet werden. Sie werden keine Ausnahmen erhalten. Um sie vom Web aus sichtbar zu machen, gibt es zwei Möglichkeiten:
-
Erstellen Sie einen Controller, der eingehende Anrufe verarbeitet und dann Dateien zurückliefert, indem er aus einem Ordner außerhalb einer Anwendung (außerhalb von wwwroot) liest.
-
Wenn Ihr Projekt groß ist und die Leistung im Vordergrund steht, sollten Sie einen separaten kleinen und schnellen Webserver für die Bereitstellung statischer Inhalte einrichten. Auf diese Weise überlassen Sie dem IIS seine spezielle Aufgabe. Dieser könnte auf demselben Rechner (mongoose für Windows) oder einem anderen Rechner (nginx für Linux) laufen. Die gute Nachricht ist, dass Sie für die Einrichtung eines Servers für statische Inhalte unter Linux keine zusätzliche Microsoft-Lizenz bezahlen müssen.
Ich hoffe, das hilft.