2009-08-20 10 views
14

Wydaje mi się, że słyszałem, że aplikacje ASP.NET zostaną wyłączone po pewnym czasie bezczynności (tj. Bez odwiedzających).Czy można uniemożliwić zamknięcie aplikacji ASP.NET?

Czy istnieje sposób zapobiegania temu zjawisku? Mam zegar, który uruchamia jakiś kod z zdarzenia_st_stock.asax.cs application_start i chce się upewnić, że nadal działa, nawet jeśli żaden odwiedzający nie odwiedza witryny.

Z góry dziękuję!

+1

W zależności od kodu, który działa, chciałbym zrobić to usługa systemu Windows, który działa na serwerze. – Martin

+0

Idealnie tak, ten kod powinien być w usłudze. Jednak dla elastyczności i przenośności zdecydowaliśmy się na uruchomienie kodu z pliku global.asax.cs. –

Odpowiedz

25

Możesz to zrobić na kilka sposobów.

  1. Jeśli masz kontrolę nad IIS, możesz zmienić "Limit czasu bezczynności" w puli aplikacji, domyślnie jest to 20 minut.
  2. Jeśli NIE masz kontroli nad usługami IIS (Shared lub inny hosting), możesz użyć usługi zewnętrznej do wysłania polecenia ping do witryny. MyWebKeepAlive lub Pingdom są dobrym rozwiązaniem dla tego.

Jeśli jesteś w opcji drugiej, zdecydowanie polecam zewnętrzne źródło, ponieważ jest ono mniej potrzebne do zarządzania, a jeśli nie masz dostępnego IIS do konfiguracji, najprawdopodobniej nie masz dostępnego serwera do dodaj aplikację ping do.

Ponadto, nie polecam coś, co siedzi w procesie z aplikacji internetowych, jak odkryli, że te mogą powodować problemy, gdy aplikacja naprawdę nie potrzebują do recyklingu ...

ostatnia myśl

Jeśli wybierzesz trasę modyfikacji limitu czasu bezczynności usług IIS, zalecamy ustawienie regularnego odtwarzania puli aplikacji. Jak wiele aplikacji internetowych korzysta z okresowego recyklingu, a najczęściej nieużywany limit czasu jest największym regularnym czynnikiem recyklingu.

+0

+1 za zewnętrzne utrzymanie przy życiu i kolejne +1 (jeśli mógłbym) za polecanie przeniesienia kodu czasowego do usługi. –

+1

+1 Zewnętrzny keeep alive działa dobrze. Można nawet napisać własną usługę, aby uruchomić serwer, aby utrzymać witrynę przy życiu. – Audioillity

+0

Ustaw "Czas bezczynności" na zero, aby całkowicie wyłączyć recykling. Zobacz także tutaj: https://stackoverflow.com/questions/1596267/how-to-disable-the-application-pool-idle-time-out-in-iis7 –

7

W IIS 6 przejdź do sekcji Pule aplikacji i kliknij prawym przyciskiem myszy> Właściwości w puli, na której znajduje się dana aplikacja ASP.NET. Przejdź do karty Wydajność i odznacz pole "Wyłącz procesy robocze po bezczynności dla:"

W IIS 7 przejdź do panelu Połączenia i znajdź pule aplikacji, a następnie wybierz Ustawienia zaawansowane dla puli, w której znajduje się aplikacja. Znajdź właściwość "Limit czasu bezczynności" i ustaw go na "0" (to wyłącza).

Ustawieniem domyślnym jest 20 minut bezczynności. Odznaczając to pole, po załadowaniu AppDomain przez proces roboczy, nigdy nie umrze (chyba że zabijesz proces lub coś w tym stylu). Domyślnie usługi IIS będą przetwarzać proces po osiągnięciu pewnego limitu, np. Limitu pamięci, ale będzie on również uruchamiał nowy i "przesuwał" wszystkie przychodzące żądania do czasu, aż stary nie będzie używany, aby zminimalizować zakłócenia.

Jeśli nie masz bezpośredniej kontroli nad konfiguracją IIS (na przykład host wspólny), najlepiej jest mieć małą aplikację uruchomioną w osobnym systemie - na przykład stale działającą stację roboczą - która trafia na Twoją witrynę co x minut, aby zapobiec przekroczeniu limitu czasu puli aplikacji. Nic nadzwyczajnego - zrobi to prosta pętla WebRequest i while() w aplikacji konsolowej.

0

Przejdź do menedżera zadań i zabij w3wp.exe (lub aspnet_wp). Nic nie może powstrzymać cię przed zrobieniem tego. Podsumowując, aplikacje ASP.NET nie mogą zakładać ciągłej funkcjonalności.

Można jednak uruchomić osobny wątek, który nie będzie podlegał bezczynności - jeśli tylko ma coś do zrobienia.Użyłem tej techniki do kontrolowania 45-minutowego importu, który byłby kontynuowany niezależnie od tego, czy ktoś był na stronie internetowej. Użyłem dziennika transakcji i Application_Start, aby po przetworzeniu procesu odebrać miejsce, w którym zostało przerwane.

13

Poza zewnętrzny utrzymać przy życiu można zrobić wewnętrzny utrzymać przy życiu wewnątrz global.asax:

static Thread keepAliveThread = new Thread(KeepAlive); 

    protected void Application_Start() 
    { 
     keepAliveThread.Start(); 
    } 

    protected void Application_End() 
    { 
     keepAliveThread.Abort(); 
    } 

    static void KeepAlive() 
    { 
     while (true) 
     { 
      WebRequest req = WebRequest.Create("http://www.mywebsite.com/DummyPage.aspx"); 
      req.GetResponse(); 
      try 
      { 
       Thread.Sleep(60000); 
      } 
      catch (ThreadAbortException) 
      { 
       break; 
      } 
     } 
    } 
+0

Pomysłowy w teorii! Ale czy ktoś go wypróbował? Czy to działa ? Ponadto, jeśli robisz to zewnętrznie i robisz to co 21 minut po app_start, to będzie się on odnawiał, a następnie restartował. Zapisz ostatni czas uruchomienia i czas zamknięcia do bazy danych, a następnie uruchom go ponownie za pomocą usługi Windows po zakończeniu każdego recyklingu. –

+1

Testowałem przed wysłaniem – Eduardo

Powiązane problemy