IISExpress zwraca błąd 503 ze zdalnych komputerów

183

Próbuję przetestować witrynę internetową uruchomioną w lokalnej instancji IISExpress na niektórych innych komputerach / urządzeniach w mojej sieci lokalnej. Używam Win7 Pro.

Kiedy po raz pierwszy próbuję przejść do mojego komputera z innego komputera w moim segmencie sieci lokalnej, pojawia się błąd 400: Nazwa hosta jest nieprawidłowa.

Rozumiem, że muszę przyznać zdalny dostęp do listy ACL za pomocą polecenia w wierszu polecenia z podwyższonym poziomem uprawnień, takiego jak:

netsh http add urlacl url=http://mymachinename:50333/ user=everyone

Teraz dostaję, że usługa 503 jest niedostępna błąd.

Zapora systemu Windows jest obecnie wyłączona i jestem w stanie przeglądać moją lokalną instancję IISExpress z adresem http://localhost:50333

Jaki jest ostatni element tej układanki konfiguracji?

Jeff Fritz
źródło
1
Co się stanie, jeśli do przeglądania http://mymachinename:50333/ z Twojego komputera?
Pułkownik Panic
1
Problem został rozwiązany. Zobacz zaakceptowaną odpowiedź od vikomall
Jeff Fritz
1
Głębsza dyskusja na ten temat tutaj: hanselman.com/blog/…
Chris Moschini
3
Możesz zainstalować nasze bezpłatne rozszerzenie VS „Conveyor”, aby obejść ten problem marketplace.visualstudio.com/…
Jim W mówi o przywróceniu Moniki

Odpowiedzi:

270

Wygląda na to, że brakuje Ci informacji o powiązaniu w pliku applicationhost.config.

  1. Otwórz plik applicationhost.config. Możliwe lokalizacje to:

    • %userprofile%\Documents\IISExpress\config\applicationhost.config
    • $(solutionDir)\.vs\config\applicationhost.config (VS2015)
    • W przeciwnym razie sprawdź dane wyjściowe, iisexpress.exeaby się upewnić.
  2. Znajdź swój wpis na stronie internetowej i dodaj następujące powiązanie z nazwą swojego komputera.

         <binding protocol="http" bindingInformation=":50333:your-machine-name" />
    
  3. Uruchom ponownie IIS Express

Vikomall
źródło
9
Nieważne. Program Visual Studio utworzył zduplikowany wpis konfiguracji dla elementu. Usunąłem go i zadziałało.
nuzzolilo
3
IIS Express nie zawsze używa pliku konfiguracyjnego w tej ścieżce. Przeczytaj iisexpress.exeuważnie dane wyjściowe, aby zobaczyć, którego pliku konfiguracyjnego używa.
Pułkownik Panic
5
Kluczowy punkt punkt 3, uruchom ponownie IIS Express! Znajdź ikonę w zasobniku systemowym i zatrzymaj ją, aby zmusić do ponownego uruchomienia. Nie jestem pewien, czy istnieje bardziej elegancki sposób. Ale to zadziałało dla mnie. Dzięki!
Senator
9
Jeśli jesteś zbyt leniwy, aby dodać każdą kombinację nazwy hosta / ipaddress, użyj * zamiast „nazwa-twojej-maszyny”
StarQuake
4
Jeszcze jedna wskazówka: jeśli klikniesz prawym przyciskiem myszy ikonę paska zadań IISExpress, możesz wybrać „Pokaż wszystkie aplikacje”, co otworzy okno dialogowe pokazujące wszystkie aplikacje, które aktualnie uruchomisz lokalnie. Kliknij żądaną aplikację prawym przyciskiem myszy (nie klikaj lewym przyciskiem myszy, aby otworzyć przeglądarkę), a następnie zobaczysz poniżej „Ścieżkę” i „Konfiguracja”. Kliknij lewym przyciskiem myszy na „Config”, a otworzy się powiązany plik Applicationhost.config, w którym musisz dodać / edytować powiązania zgodnie z powyższym opisem. To łatwy sposób na zlokalizowanie bieżącej konfiguracji.
Matt
31

Była tylko jedna rzecz, która działała dla mnie.

używanie *:portnumber:*nie było dobre. Tak, po wykonaniu tej czynności i upewnieniu się, że Zapora systemu Windows jest otwarta, mogłem połączyć się z portem, ale nadal pojawia się błąd „503”.

Przetestowałem kilka rzeczy lokalnie i odkryłem, że działa tylko http: // localhost . Używając rzeczywistego adresu IP (nie 127.0.0.1, ale na przykład 192.168.1.50), nadal zwracał 503 nawet na komputerze lokalnym. Próbowałem użyć prawdziwej nazwy hosta w powiązaniach, ale IIS Express odmówił uruchomienia. Może to mieć coś wspólnego ze sposobem rozwiązywania nazwy hosta. Nie zgłębiałem tego dalej.

Wreszcie skończyłem na tej konfiguracji:

<binding protocol="http" bindingInformation="*:53351:localhost" />
<binding protocol="http" bindingInformation="192.168.1.50:53351:*" />

W ten sposób mogłem połączyć się ze zdalnego komputera za pomocą http://192.168.1.50:53351.

Jaszczurka
źródło
Uderzyłem dokładnie ten błąd, ale nie chciałem na stałe wpisywać aktualnego adresu IP do konfiguracji, ponieważ można go zmienić. Znalazłem, że symbol wieloznaczny działa na części adresu IP i nazwy hosta, więc skończyłem na: <binding protocol="https" bindingInformation="*:44300:*" /> <binding protocol="http" bindingInformation="*:8888:*" /> edit: naprawdę próbowałem zrozumieć obniżkę SO, wychodzę :).
Brian Barker
19

Po marnowaniu ponad 3 godzin na tak pełny temat postanowiłem podzielić się z Wami moją konfiguracją. Moja konfiguracja to Visual Express 2012 dla aktualizacji sieci Web 4 w systemie Windows 8. To był mój pierwszy powrót do MS VS od czasu studiów (co najmniej 8 lat) i teraz jestem pewien, że linux rządzi. W przypadku django taka konfiguracja zajęła mi 10 minut przeszukiwania dokumentacji.

  1. wyłącz zaporę na czas testowania

    netsh advfirewall set allprofiles state off
    
  2. konfiguracja powiązań w moim przypadku adres lokalny to localIP = 192.168.1.102 (ponieważ linki nie mogą zawierać domeny nieliczbowej, użyj go poniżej zamiast mylocaldomain.com, zobacz zasady stackoverflow) w Documents\IISExpress\config\applicationhost.config

    <bindings>
        <binding protocol="http" bindingInformation="*:53351:mylocaldomain.com" />
        <binding protocol="http" bindingInformation="*:53351:localhost" />
    </bindings>
    
  3. automatycznie dodaje autorun dla usługi uruchamiania ISS Express

    <site name="NeuronCharts" id="2" serverAutoStart="true">
    
  4. Dodaj kilka dziwnych reguł do serwera http (wciąż nie wiem, czy jest to konieczne)

    netsh http add urlacl url=http://mylocaldomain.com:53351/ user=everyone
    
  5. uruchom IISExpress ręcznie nie z VS IDE

  6. zobaczysz, że ISSExpress rejestruje powiązania
  7. uruchom przeglądarkę, http://mylocaldomain.com:53351 jeśli działa, możemy dodać regułę zapory
  8. dodaj regułę zapory ogniowej

    netsh advfirewall firewall add rule name="IISExpressWeb" dir=in protocol=tcp localport=53351 remoteip=any action=allow
    

ustaw remoteip na dowolny, jeśli chcesz uzyskać dostęp do serwera z zewnątrz, jeśli chcesz uzyskać dostęp do sieci lokalnej, skorzystaj z locals podsieci

  1. uruchom zaporę ogniową

    netsh advfirewall set allprofiles state on
    
  2. sprawdź ponownie, czy wszystko działa na lokalnym i publicznym IP

Życzę powodzenia

Rafał

Rafał
źródło
3
To spowodowało, że IIS Express przestał działać na Win8 z VS2013 bez uruchamiania VS2013 jako Administrator. Jest to spowodowane tym, że IIS Express próbuje teraz otworzyć się na ruch zewnętrzny w wyniku polecenia netsh. Nigdy też nie byłem w stanie zmusić go do obsługi tego ruchu; Dostałbym 503. Aby odwrócić problem spowodowany poleceniem netsh w tej odpowiedzi, uruchom to z wiersza polecenia działającego jako Administrator: netsh http delete urlacl url=http://*:55416/(zamień port na swój port)
Chris Moschini
fwiw - Nie potrzebuję kroku 4 (wywołanie netsh, że @Rafal nie jest pewien, jest konieczne) i chociaż nie potrzebuję wiązania „localhost” w kroku 2, aby uruchomić projekty VS2013 w moim rozwiązaniu, front koniec ładuje się znacznie szybciej, gdy powiązanie „localhost” pozostanie na swoim miejscu.
lukkea
Odkryłem, że wykonanie powyższych instrukcji wciąż skutkowało 503 użyciem localhost. Okazało się, że gość (Windows) Nazwa maszyna musiała być w oprawach w applicationhost.config, a na komputerze (Mac) gość nazwa maszyna musiała być odwzorowane na 127.0.0.1w /etc/hosts. Dopiero wtedy żądanie do maszyny gościa na hoście powiodło się.
Matt
Jeden dodatek do kroku 5. Użyj iisexpress.exe / siteid: id, gdzie id jest wartością atrybutu id witryny w ustawieniu <site id = "id">, w przeciwnym razie uruchomi się pierwsza strona.
Mudit Jain
9

Stwierdzono, że problem związany był ze złym mapowaniem adresu URL. Aby to rozgryźć:

netsh http show urlacl 

i poszukaj rzeczy takich jak http://+:80/lub port, z którym się wiążesz.

Następnie użyj

netsh http delete url=<the url from the list>

To rozwiązało problem.

Anthony Rizzolo
źródło
4
powinien być netsh http delete urlacl url = <adres URL z listy>, działało to dla mnie dzięki!
sergiogx,
1
Jest to omówione bardziej szczegółowo na blogu msdn . To był ostatecznie mój problem.
Kevin Scharnhorst
3
Dzięki, dokładna składnia tonetsh http delete urlacl <yoururl>
yoel halb
7

Nic mi nie działało. Wreszcie znalazłem iisexpress-proxy

Zobacz moją odpowiedź https://stackoverflow.com/a/33623399/631527

Innym rozwiązaniem jest ngrok

zestaw narzędzi
źródło
Niesamowity! Wypróbowałem wszystkie inne rozwiązania i one również nie działały. „Złe żądanie” lub „Usługa niedostępna”. Zbyt skomplikowane. Zainstalowałem moduł węzła i uruchomiłem go, to natychmiast działa !!
TetraDev
PRACUJE! święty! Dziękuję Ci!
Ayson Baxter
sprawdź również ngrok
Zestaw narzędzi
1
PO PROSTU działa jak urok z ngrok! Dziwne jest to, że najpierw trzeba kierować z hosta lokalnego do iis-proxy, a następnie z proxy do ngrok, ale hej, działało! Na przykład mam mój iisexpress na porcie 3028. Pobiegłem iisexpress-proxy 3028 to 12345i wtedy ./ngrok.exe http 12345. 😅
Reuel Ribeiro,
@TetraDev, „Złe żądanie” lub „Usługa niedostępna” było spowodowane tym, że nagłówek hosta odebrany podczas uzyskiwania dostępu do localhost z ngrok nie był hostem lokalnym, jak wyjaśniono tutaj
Dani Torres
3

Pomogło mi kliknięcie prawym przyciskiem myszy ikony „IISExpress” „Pokaż wszystkie aplikacje”. Następnie wybrałem stronę i zobaczyłem, z którego pliku aplicationhost.config korzysta, a poprawka poszła idealnie.

Konfiguracja IISExpress

Emmanuel
źródło
1

Problemem jest aktualizacja pliku applicationhost.config w folderze internetowym zamiast rozwiązania. Plik konfiguracji rozwiązania należy zmienić

Victor Arce
źródło
1

Po rozwiązaniu @vikomall nie zapomnij uruchomić VS jako administrator. Napraw to dla mnie.

Rapido
źródło
0

Odnośnie odpowiedzi Anthony'ego Rizzolo: w Windows 8.1 musiałem napisać w ten sposób:

netsh http delete urlacl url=<the url from the list>

Na przykład:

netsh http delete urlacl url=http://+:8689/
Elrinth
źródło
0

Żadna z powyższych odpowiedzi nie działała dla mnie.

Mam dwa wpisy w netsh dla tej samej usługi

netsh http show urlacl

wprowadź opis zdjęcia tutaj

Jeden używa silnej karty wieloznacznej, a drugi słabej karty wieloznacznej.

Usunięcie tej ze słabym znakiem wieloznacznym wykonało zadanie.

Więcej informacji o silnej i słabej karcie wieloznacznej w kontekście narzędzia netsh

Gdy element hosta UrlPrefix składa się z pojedynczego znaku plus (+), UrlPrefix dopasowuje wszystkie możliwe nazwy hosta w kontekście jego schematu, portu i względnych elementówURI i należy do kategorii silnych symboli wieloznacznych.

Kiedy gwiazdka (*) pojawia się jako element hosta, wówczas UrlPrefix należy do kategorii słabych symboli wieloznacznych. Ten rodzaj UrlPrefix jest zgodny z dowolną nazwą hosta powiązaną z określonym schematem, portem i względnymURI, który nie został jeszcze dopasowany przez silną zmienną wieloznaczną, jawną lub powiązaną z IP słabą zmienną wieloznaczną UrlPrefix. Ta specyfikacja hosta może być używana jako domyślna opcja catch-all w niektórych okolicznościach lub może być użyta do określenia dużej sekcji przestrzeni nazw URL bez konieczności używania wielu UrlPrefiksów.

https://docs.microsoft.com/en-gb/windows/desktop/Http/urlprefix-strings

Matcheek
źródło