2013-08-05 5 views
6

Ich entwickle eine ASP.NET 4 App und benutze auch während der Entwicklung vollen IIS (aus verschiedenen Gründen; einen, den ich mehrere Domains verwende, die auf die App verweisen).Delay AppDomain recycle auf Ordnerwechsel

Wenn ich das Projekt in Visual Studio erstellen IIS recycle die AppDomain und lädt die neu erstellte, aber jetzt habe ich das Problem, dass es dies "zu schnell".
Ich habe einige Skripte auf meiner Seite, die einen App-Start auslösen, sobald es recycelt wird (wie ständig offene SignalR-Kanäle) und so eine neue AppDomain bereits erstellt wird, wenn nur die Hälfte meines Projekts gebaut wird und es eine Sekunde wiederverwendet Zeit, die dann tatsächlich abstürzt, weil ich eine PreApplicationStartMethod habe, die einige Plugin-DLLs in ein Shadow-Copy-Verzeichnis kopiert, aber die "alten DLLs" sind immer noch durch die erste AppDomain gesperrt.
Wenn ich dann ~ 10s warte, ist alles in Ordnung und meine "neue AppDomain" startet.
Ich habe dieses Problem gelöst, indem ich einfach IIS angewiesen habe, einige Sekunden mit dem Empfang zu warten, damit der Build abgeschlossen werden kann, nachdem er die Änderungen im Ordner bin entdeckt hat.

So zu meiner Hauptfrage:
Ist es möglich, eine AppDomain Recycling unter IIS zu verzögern?

+1

Wenn es nur ein Lock-Problem ist, haben Sie versucht, "Overlapped Recycle" zu deaktivieren, um zwei gleichzeitige Worker-Prozesse zu vermeiden? – JoeBilly

Antwort

14

Wenn Sie die AppDomain recycle nicht verzögern können, können Sie es deaktivieren möchten.

Es gibt ein File Change Notification (FCN) Verhalten, das deaktiviert werden kann.

Registry

Ursprünglich ist es ein DWORD-Registrierungseintrag in HKLM\Software\Microsoft\ASP.NET\FCNMode, setting the value to 1 should disable it.

-Code (Hack) bis zu .NET Framework 4,0

Diese hacken könnte mit 2,0 bis 3,5 und 4,0 Frameworks arbeiten.

//Disable AppDomain restart on file change 

System.Reflection.PropertyInfo p = 
    typeof(System.Web.HttpRuntime).GetProperty("FileChangesMonitor", 
     System.Reflection.BindingFlags.NonPublic 
     | System.Reflection.BindingFlags.Public 
     | System.Reflection.BindingFlags.Static); 

object fcm = p.GetValue(null, null); 

System.Reflection.MethodInfo m = fcm.GetType().GetMethod("Stop", 
    System.Reflection.BindingFlags.Instance 
    | System.Reflection.BindingFlags.NonPublic); 
m.Invoke(fcm, new object[] { }); 

Lassen Sie es in Ihrem Global.asaxApplication_Start. Siehe here. Wenn Sie die Überwachung für bestimmte Pfade oder Dateien deaktivieren möchten, können Sie StopMonitoringFile oder StopMonitoringPath Methoden von FileChangesMonitor verwenden. Das Verzeichnis Bin ist jedoch ein spezielles Verzeichnis und kann gegen diese beiden Methoden immun sein.

Zumindest können Sie mit dem _dirMonSpecialDirs Feld spielen und StopMonitoring() auf Ihrem Bin Verzeichnis aufrufen.

.NET Framework 4.5

In .NET Framework 4.5 existiert eine HttpRuntimeSection.FcnMode -Eigenschaft. Es gibt nicht so viel Dokumentation darüber, aber Sie können <httpRuntime fcnMode="Disabled"/> verwenden.

+0

Vielen Dank für Ihre Eingabe, aber nach dem Bild in dem Artikel, den ich verlinkt, sollte es so funktionieren. Ich wollte auch vermeiden, FCNs zu deaktivieren, aber ich könnte es versuchen, um sicher zu sein, dass es tatsächlich die Ursache meines Problems ist ... – ChrFin

+0

Sie können Recht haben, aber ich habe es nie funktioniert gesehen :( – JoeBilly

+4

Ich kann bestätigen, dass Funktioniert in 4.5. Danke! – Bernesto