2013-08-05 16 views
6

Pracuję aplikacji ASP.NET 4 i używać pełnego IIS również podczas programowania (z kilku powodów, z których korzystam z wielu domen wskazujących na aplikację).Opóźnienie AppDomain recyklingu na zmianę folderu

Kiedy buduję projekt w Visual Studio IIS przetwarza aplikację AppDomain i ładuje nowo utworzoną, ale teraz mam problem, że robi to "szybko".
Mam kilka skryptów na mojej stronie, które uruchamiają App-Startup, gdy tylko zostaną przetworzone (jak stale otwarte kanały SignalR), a więc nowa AppDomain jest już utworzona, gdy zbudowana jest tylko połowa mojego projektu i dlatego przetwarza drugą czas, który faktycznie się zawiesza, ponieważ mam PreApplicationStartMethod kopiowanie niektórych bibliotek DLL-ów do katalogu kopiowania w tle, ale "stare biblioteki DLL" są nadal zablokowane przez pierwszą AppDomain.
Jeśli wtedy czekam ~ 10 s wszystko jest w porządku i uruchamia się moja "nowa AppDomena".
Rozwiązałem ten problem, po prostu informując IIS, aby poczekał z ponownym odczytaniem przez kilka sekund, aby kompilacja mogła zakończyć się po wykryciu zmian w folderze bin.

Więc na moje główne pytanie:
Czy można opóźnić przetwarzanie AppDomain w IIS?

+1

Jeśli jest to tylko problem z blokadą, czy próbowałeś "wyłączyć nakładanie się recyklingu", aby uniknąć dwóch jednoczesnych procesów roboczych? – JoeBilly

Odpowiedz

14

Jeśli nie można opóźnić odtworzenia AppDomain, możesz ją wyłączyć.

Istnieje Zachowanie powiadomienia o zmianie pliku (FCN), które można wyłączyć.

Registry

Oryginalnie jest to wpis rejestru DWORD w HKLM\Software\Microsoft\ASP.NET\FCNMode, setting the value to 1 should disable it.

Code (Hack) do .NET Framework 4.0

Ten włamać może pracować z 2,0-3,5 do 4,0 ram.

//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[] { }); 

upuść go w Global.asaxApplication_Start. Zobacz here.

Jeśli chcesz wyłączyć monitorowanie określonych ścieżek lub plików, możesz użyć metod StopMonitoringFile lub StopMonitoringPath z FileChangesMonitor. Jednak katalog Bin jest specjalnym katalogiem i może być odporny na te dwie metody.

Przynajmniej możesz grać za pomocą pola _dirMonSpecialDirs i zadzwonić pod numer StopMonitoring() w swoim katalogu Bin.

.NET Framework 4.5

W programie .NET Framework 4.5 istnieje właściwość HttpRuntimeSection.FcnMode. Nie ma tam zbyt wiele dokumentacji, ale można użyć <httpRuntime fcnMode="Disabled"/>.

+0

Dzięki za twój wkład, ale zgodnie z obrazkiem w artykule, który łączyłem, powinien działać w ten sposób. Chciałem także uniknąć wyłączania FCN, ale mogłem spróbować, aby to było naprawdę przyczyną mojego problemu ... – ChrFin

+0

Może masz rację, ale nigdy nie widziałem, żeby to działało :( – JoeBilly

+4

Mogę potwierdzić, że Działają w 4.5. Dzięki! – Bernesto

Powiązane problemy