2012-12-05 14 views
5

próbuję programowo dostać mój status witryny z IIS, aby sprawdzić, czy jest zatrzymany, ale ciągle otrzymuję następujący błąd,Programowo uzyskać stan witryny z IIS, wróci błąd COM

Identyfikator obiektu nie robi reprezentują poprawny obiekt. (Wyjątek od HRESULT: 0x800710D8)

Aplikacja korzysta z klasy SiteManager w celu uzyskania dostępu do statusu witryny. Oto kod,

//This is fine, gets back the site 
var serverManager = new Microsoft.Web.Administration.ServerManager(ConfigPath); 
var site = serverManager.Sites.FirstOrDefault(x => x.Id == 5); 
if (site == null) return; 
var appPoolName = site.Applications["/"].ApplicationPoolName; 
//error! 
var state = site.State; 

mam sprawdzian ze strony statycznej wyizolować problem, upewniając się, że witryna jest uruchomiona, wszystkie są ważne konfiguracji punkt do ważnej puli aplikacji ... etc.

Daj mi znać, jeśli potrzebujesz więcej informacji. Czy to jest COM?

Odpowiedz

7

Odkryłem, gdzie jest problem. Zasadniczo menedżer serwera składa się z dwóch części, pierwsza część menedżera serwera umożliwia odczytanie szczegółów witryny z pliku konfiguracyjnego, co robiłem powyżej. Problem polega na tym, że możesz uzyskać tylko informacje znajdujące się w pliku, a stan witryny nie jest jego częścią.

Druga część programu Menedżer serwera umożliwia bezpośrednie łączenie się z usługami IIS i robi to poprzez interakcję z elementem COM. Więc to, co powinien robić to w ten sposób:

ServerManager manager= ServerManager.OpenRemote("testserver"); 
var site = manager.Sites.First(); 
var status = site.State.ToString() ; 
+1

Bardzo prosty i bardzo użyteczny. Wielkie dzięki! –

+0

Jest to poprawne, ogólnie udokumentowane w MSDN, że przeciążenie konstruktora dla ServerManagera, który otrzymuje fizyczną ścieżkę, nigdy nie powinno być używane, to jest dla wewnętrznej infrastruktury, a jak widzisz, może to mieć bardzo szkodliwe efekty, jeśli zostanie użyte. Rzeczy tak złe, jak usunięcie niewłaściwej konfiguracji i certyfikatu SSL, które naprawdę mogą uszkodzić twoją konfigurację, więc tak, jeśli próbujesz zarządzać zdalnymi maszynami, używaj tylko OpenRemote. –

2

miałem podobny problem, ale mój był spowodowany opóźnieniem potrzebne, aby uaktywnić zmiany z wezwaniem do CommitChanges na obiekcie ServerManager. Znalazłem odpowiedź, co potrzebne tutaj:

ServerManager CommitChanges makes changes with a slight delay

Wydaje się, że pobieranie jest wymagane, aby uzyskać spójne wyniki. Coś podobnego do tego rozwiązało mój problem (otrzymałem wyjątek podczas uzyskiwania dostępu do nowo dodanej puli aplikacji):

 ... 
     create new application pool 
     ... 
     sman.CommitChanges(); 
     int i = 0; 
     const int max = 10; 
     do 
     { 
      i++; 
      try 
      { 
       if (ObjectState.Stopped == pool.State) 
       { 
        write_log("Pool was stopped, starting: " + pool.Name); 
        pool.Start(); 
       } 
       sman.CommitChanges(); 
       break; 
      } 
      catch (System.Runtime.InteropServices.COMException e) 
      { 
       if (i < max) 
       { 
        write_log("Waiting for IIS to activate new config..."); 
        Thread.Sleep(1000); 
       } 
       else 
       { 
        throw new Exception(
         "CommitChanges timed out efter " + max + " attempts.", 
         e); 
       } 
      } 
     } while (true); 
     ... 
+0

To był problem dla mnie i +1 dla pomocnika :) – Shazi

Powiązane problemy