2010-11-19 13 views
7

Mam aplikację sieci web ASP.NET działającą pod IIS 6 i inny proces, który jest odpowiedzialny za monitorowanie i raportowanie statusu.Jak ustalić, czy aplikacja internetowa jest obecnie uruchomiona?

Chciałbym wypróbować aplikację internetową przez proces monitorowania w celu sprawdzenia jej stanu, uzyskując dostęp do dedykowanego programu obsługi w aplikacji internetowej, ALE Nie chcę "obudzić" aplikacji internetowej w sprawa nie działa.

Czy istnieje opcja określenia, czy konkretna aplikacja internetowa jest obecnie uruchomiona? jeśli istnieje taka opcja, byłbym w stanie najpierw sprawdzić, czy aplikacja jest uruchomiona, a dopiero potem uzyskać dostęp do programu obsługi, aby sprawdzić jego status.

Dzięki.

Odpowiedz

0

Chciałbym dołączyć do witryny ASP.NET plik ASMX, usługę internetową z prostą funkcją Ping, ale nadal będzie budził pulę aplikacji na stronie.

+0

'[WebMethod] public bool IsSiteActive {return true;/* Tak, teraz jest to * /} ' – GvS

+1

to zawsze zwróci" true ", tak jak wtedy, gdy uzyskasz dostęp do tego pakietu, gdy aplikacja nie zostanie uruchomiona - spowoduje to uruchomienie aplikacji i dostęp do niej będzie możliwy. więc niestety nie jest to rozwiązanie. – Satumba

0

Można przeanalizować plik dziennika IIS, aby sprawdzić, czy istnieją ostatnie wpisy.

Jeśli twoja aplikacja nie jest używana dużo, możliwe jest, że najnowsze "wejście" nadal musi zostać przepłukane.

Lub możesz zaktualizować plik/bazę danych, aby wskazać "nadal aktywny".

Jeśli naprawdę nie chcesz opóźnienia, w Application_Start i ApplicationEnd, utwórz i zniszcz system mutex.

+0

Mogę utworzyć flagę (przy użyciu pliku lub bazy danych), która będzie aktualizowana w aplikacji Application_Start i Application_End, ale czy uważasz, że jest wystarczająco bezpieczna? Czy mogę liczyć, że Application_End zawsze będzie występować? także na wyjątek aplikacji? – Satumba

+1

Myślę, że będziesz musiał przetestować. – GvS

0

To jest moje rozwiązanie:

try 
    { 
     WebRequest request = WebRequest.Create("http://localhost/"); 
     WebResponse response = request.GetResponse(); 
    } 
    catch (WebException ex) 
    { 
     // ex.Status will be WebExceptionStatus.ConnectFailure 
     // if the site is not currently running 
    } 
2

musiałem zrobić coś podobnego wcześniej w tym roku na IIS7, nie wiem, czy to będzie działać na IIS6 ale oto co zrobiłem.

 var iis = new DirectoryEntry("IIS://" + Environment.MachineName + "/w3svc"); 

     foreach (DirectoryEntry site in iis.Children) 
     { 
      if (site.SchemaClassName.ToLower() == "iiswebserver") 
      { 
       Console.WriteLine("Name: " + site.Name); 
       Console.WriteLine("State: " + site.Properties["ServerState"].Value); 
      } 
     } 

ServerState zwraca 2 dla początku i 4 dla zatrzymanego.

+0

To wygląda fajnie i elegancko. Przeszukałem go i wygląda na to, że wspiera go również IIS6. Spróbuję i zaktualizuję. Wielkie dzięki! – Satumba

+0

Jak poszło? Czy to działa? – Phill

+0

Niestety to nie wydaje się działać. Nie otrzymuję statusu mojej aplikacji do katalogu wirtualnego. wciąż to sprawdzam. – Satumba

0

Korzystaliśmy z Nagios do monitorowania naszej strony i kierowaliśmy ją na stronę naszego serwisu. Gdyby udało się cofnąć ikonę, wiedzieliśmy, że strona jest już gotowa.

Powiązane problemy