Jak zachować ASP.NET assemblies w AppDomain alive?

Scenariusz: I ' ve an n-Tier enterprise ASP.NET aplikacja wdrożona przy użyciu Web Deployment Projects. Wszystkie warstwy produkują niezależne zespoły, które są zużywane przez ASP.NET podanie.

Problem: kiedy uruchamiam aplikację. po raz pierwszy po wdrożeniu Ładowanie zależnych zespołów w pamięci zajmuje dużo czasu. Ale po załadowaniu aplikacji lighting fast. W przypadku, gdy nie ma użytkowników uzyskujących dostęp do aplikacji, usługa IIS rozładowuje zespoły z pamięci i gdy użytkownik próbowałem uzyskać dostęp do aplikacji na późniejszym wystąpieniu, ładuje wszystkie zespoły po raz kolejny, biorąc tyle samo czasu, aby załadować, ile potrzeba, aby to zrobić po raz pierwszy.

Szukam rozwiązania, które pozwoli mi utrzymać moje zespoły załadowane do pamięci uporczywie nadpisując ulotny charakter zespołów w kierunku rezydencji pamięci.

Lub inne rozwiązanie, które pozwala moim użytkownikom szczęśliwie korzystać z aplikacji rozwiązującej wspomniany problem.

Author: Rex M, 2009-05-08

3 answers

W IIS 6 , Przejdź do sekcji Pule aplikacji i kliknij prawym przyciskiem myszy > Właściwości na puli, która hostuje ASP.NET wniosek, o którym mowa. Przejdź do karty wydajność i odznacz opcję "Zamknij procesy robocze po bezczynności dla:"

W programie IIS 7 Przejdź do okienka połączenia i znajdź Pule aplikacji, a następnie wybierz Ustawienia zaawansowane dla puli, w której znajduje się Twoja aplikacja. Znajdź właściwość" Idle Timeout "i ustaw ją na" 0 " (to ją wyłącza).

Domyślnie jest 20 minut bezczynności. Odznaczając to pole, gdy twój AppDomain {[10] } zostanie załadowany przez proces worker , Nigdy nie umrze(chyba że zabijesz proces lub coś, oczywiście). Domyślnie program IIS będzie przetwarzał proces, gdy osiągnie pewien limit, taki jak limit pamięci, ale uruchomi również nowy i "przefazuje" wszystkie przychodzące żądania, dopóki stary nie będzie nieużywany, aby zminimalizować zakłócenia.

Napisałem też małą klasę c#, która zachowa Twój ASP.NET application alive (alternatywna wersja archiwalna ) W normalnych okolicznościach. Ponieważ działa w aplikacji, oczywiście nie może powstrzymać IIS lub czegokolwiek innego przed jawnym zabiciem procesu, ale zachowa aplikację "gorącą", np. aplikacja nigdy nie będzie bezczynna wystarczająco długo, aby IIS zdecydował się ją wyłączyć.

Jeśli nie masz bezpośredniej kontroli nad konfiguracją usług IIS (na przykład współdzielonego hosta), najlepszym rozwiązaniem jest uruchomienie małej aplikacji na oddzielnym systemie-powiedzmy, zawsze włączonej stacji roboczej - która trafia na Twoją witrynę co X minut, aby utrzymać pulę aplikacji przed upływem czasu. Nic wymyślnego-wystarczy prosta WebRequest i pętla while () W aplikacji konsolowej.

 72
Author: Rex M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-06 05:12:06

Jedną z zalet ASP. net jest możliwość tworzenia statycznych (współdzielonych) instancji obiektów.

Aby uniknąć konieczności zewnętrznego procesu, możesz utworzyć statyczny timer w (na przykład) global.asax, który wymaga strony w domenie z prostym WebRequest. W ten sposób strona utrzymuje się przy życiu, dopóki nie zostanie wykonany ręczny reset puli.

 3
Author: Gusman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-18 16:38:34

Napisałem małą aplikację konsolową C#, która utrzymuje moje 4 witryny przy życiu co 10 minut za pomocą Harmonogramu zadań systemu windows. Życie znów jest dobre. Nie uruchamiamy aplikacji od 2 do 5 rano, tylko po to, aby serwery mogły czyścić pamięć, jeśli to w ogóle ma znaczenie. na naszych stronach rzadko jest ktoś w tych godzinach i tak.

 0
Author: Namoguy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-03 04:30:05