2012-03-02 21 views
23

Nie jestem pewien, czy jest to możliwe, ale mam nadzieję, że znajdzie się wskazówka, czy program aktualnie uruchomiony działa w IIS Express. Moim najlepszym przybliżeniem tej pory, co jest niezwykle hackish i na pewno nie/przerwę w pewnym momencie:Programowo ustalić, czy kod działa pod IIS Express

bool IsExpress = 
    Request.ServerVariables["SERVER_SOFTWARE"] == "Microsoft-IIS/7.5" 
    && Int32.Parse(Request.ServerVariables["INSTANCE_ID"]) > 1000000000; 

pewnością nie musi być lepszy sposób. Moje badanie obiektów Application, Server i Request nie ujawniło niczego, co mogłoby zapewnić lepszy wgląd. Być może po prostu muszę popatrzeć na jakiś inny obiekt?

Aktualizacja:

Jestem bardzo ciekawy, czy istnieje sposób, aby wykryć to - to jest naprawdę akademicki w tym momencie nie mam pieczenie trzeba go używać. Pierwotne pytanie stoi. Ale w duchu odpowiadania na komentarze, w szczególności jestem zainteresowany odpowiedzią na krytykę z innego pytania/odpowiedzi na tej stronie: How to search the server's MIME map. Krytyka jest taka, że ​​opublikowana odpowiedź nie działa w IIS Express, tylko w tradycyjnych instancjach IIS. IIS Express przechowuje konfigurację MIME w pliku XML applicationhost.config i chciałbym zaktualizować tę odpowiedź, aby zapewnić sposób na zwrócenie tej informacji również dla IIS Express. Mogłabym po prostu dodać kod, który pobiera odpowiednią wartość z XML (Yay dla LINQ do XML!), Ale naprawdę chciałbym, aby było to mądrzejsze. Aby było jasne, nie potrzebuję pomocy podczas analizowania tego pliku - po prostu coś bardziej eleganckiego w próbie wykrycia, czy kod jest aktualnie wykonywany w silniku IIS Express.

Aktualizacja 2:

IIS 8.0 Express, beta released this week, a ponadto pokazuje, że podejście w moim pytaniem jest kruche i pęknie. Mimo że nie jest to narzędzie rozstrzygające o konkretnej wersji, dobrze byłoby wyjaśnić tę kwestię i spróbować upewnić się, że kod będzie działał co najmniej z obecnie znanymi wersjami.

+0

jaki jest twój cel? dlaczego chcesz to wykryć (być może jest jakiś inny sposób na osiągnięcie twojego celu)? – Yahia

+5

Jeśli działa w IIS Express, co chcesz obsługiwać inaczej? Może to pytanie, które należy zadać, a nie jak wykryć IIS Express. "Jak zrobić ____ zamiast _____ po uruchomieniu w debugowaniu?", Na przykład. –

+0

Pragnienie koncentruje się wokół sprawdzania niektórych elementów konfiguracyjnych - za pomocą DirectoryEntry ("IIS:/localhost/W3SVC /") a analizowania XML w pliku applicationhost.config, który steruje usługą IIS Express. – Goyuix

Odpowiedz

24

Czy sprawdzanie aktualnej nazwy procesu było możliwe?

bool isExpress = 
    String.Compare(Process.GetCurrentProcess().ProcessName,"iisexpress") == 0; 

Normal IIS działa pod w3wp.exe z pamięci.

+1

To jest 'w3wp' dla IIS 7.5 - ale nie jestem pewien o różnych wersjach IIS. Wiem, że to coś innego niż stare, stare wersje IIS ... – debracey

+1

@bracey tak dla starszych wersji będzie to 'aspnet_wp.exe'. – Strelok

+0

Jedyny potencjalny problem, jaki napotkałem przy takim podejściu, to że klasa System.Diagnostics.Process wymaga pełnego zaufania. W przeciwnym razie wydaje się, że działa jak urok. – Goyuix

2

Jeśli nie przeszkadza spada do poziomu API COM, można użyć Menedżera IIS API Wersja

http://msdn.microsoft.com/en-us/library/gg418429.aspx

jest jakaś dyskusja o tym, jak to zostało użyte w tym SO post: Starting and stopping IIS Express programmatically - - Nie dokładnie to, co chcesz, ale dyskutują przy użyciu API.

Edycja: Powinienem dodać, że sam tego nie próbowałem, ale wydaje się obiecujący, powodzenia!

+0

Zajrzałem do tego API, ale miałem dwie rezerwacje: jedną oznaczono jako "nieprzeznaczone do użycia bezpośrednio z twojego kodu" - nie jest to wyłącznik, ale nie zachęcający. Dwa nie wiem, jak (lub nawet jeśli potrafisz) połączyć aktualnie wykonywalny kod z instancją zwróconą z interfejsu API. Może poprzez dopasowanie adresów URL lub coś podobnego. – Goyuix

+0

Nie jestem pewien, do czego zmierzasz - ale to, co chciałbym zrobić, to przeciągnąć wersję IIS do twojego kodu (do twojego własnego zarządzanego 'enum' może), kiedy pula aplikacji uruchomi się, a następnie zapamiętasz to w statycznej zmiennej - - nie wychodź z zapytaniem o COM API za każdym razem. Typ serwera oczywiście nie może się zmienić bez ponownego uruchamiania aplikacji. – debracey

+0

Po utworzeniu klasy IISVersionManager można uzyskać listę instancji IIS dostępnych na komputerze, ale nie mam możliwości odwzorowania tego interfejsu IISVersion na kod wykonywany wewnątrz instancji IIS. Naprawdę nie rozumiem, w jaki sposób ten interfejs COM API pomaga mi dowiedzieć się, czy aktualnie uruchomiony kod znajduje się wewnątrz IIS Express, czy nie - nie tylko dlatego, że IIS Express jest dostępny. Może próbka kodu pomoże ci wyjaśnić, co sugerujesz? – Goyuix

2

Nie możemy sprawdzić, czy jeden lub więcej limitation of IIS Express działa, czy nie, jeśli działa, to nie jest IIS Express. Przykład IIS Express nie obsługuje usług SharePoint

+0

Czy możesz podzielić się z nami tymi konkretnymi (lub innymi) ograniczeniami, które według Ciebie można wiarygodnie przetestować? – Goyuix

+0

jakieś zapytanie, np. Zmienne środowiskowe% IISBin% byłoby dobrą wskazówką? lub usługa punktu udostępniania zapytań, a jeśli wynik nie jest obsługiwany - wyjątek, o którym wiemy, że jesteśmy w IIS Express –

+0

Testowanie dla% IIS_BIN% może działać, wygląda na to, że tylko IIS Express ustawia tę zmienną. Jedynym problemem jest to, że klasa EnvironmentPermission może być ustawiona na odmowę dostępu do tych zmiennych. Nie mam pojęcia, co masz na myśli przez "zapytanie o usługę punktu udostępniania" - SharePoint to produkt, który możesz zainstalować, a nie coś natywnego dla IIS. – Goyuix

Powiązane problemy