IISExpress restituisce un errore 503 dai computer remoti


183

Sto tentando di testare un sito Web che ho in esecuzione in un'istanza IISExpress locale con altre macchine / dispositivi sulla mia rete locale. Sto eseguendo Win7 Pro.

Quando provo per la prima volta a cercare la mia macchina da un'altra macchina sul mio segmento di rete locale, ricevo un errore 400: Il nome host non è valido.

Comprendo che devo concedere l'accesso remoto all'ACL con un comando sul prompt dei comandi con privilegi elevati come:

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

Ora ottengo un servizio 503 errore non disponibile.

Windows Firewall è attualmente spento e sono in grado di sfogliare la mia istanza IISExpress locale con l'indirizzo http://localhost:50333

Qual è l'ultimo pezzo di questo puzzle di configurazione?


1
Cosa succede se navighi http://mymachinename:50333/ dal tuo computer?
Colonnello Panic,

1
Il problema è stato risolto Vedi la risposta accettata da vikomall
Jeff Fritz

1
Discussione più approfondita qui: hanselman.com/blog/…
Chris Moschini,

3
Puoi installare la nostra estensione VS gratuita "Conveyor" per aggirare questo problema marketplace.visualstudio.com/…
Jim W dice di ripristinare Monica

Risposte:


270

Sembra che manchi una voce di informazione vincolante nel file applicationhost.config.

  1. Apri il tuo file applicationhost.config. Le posizioni possibili sono:

    • %userprofile%\Documents\IISExpress\config\applicationhost.config
    • $(solutionDir)\.vs\config\applicationhost.config (VS2015)
    • In caso contrario, ispezionare l'uscita iisexpress.exeper essere sicuri.
  2. Individua la voce del tuo sito Web e aggiungi la seguente associazione con il nome della tua macchina.

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


9
Non importa. Visual Studio ha creato una voce di configurazione duplicata per l'elemento. L'ho rimosso e ha funzionato.
nuzzolilo,

3
IIS Express non utilizza sempre il file di configurazione in quel percorso. Leggere iisexpress.exeattentamente l'output per vedere quale file di configurazione sta utilizzando.
Colonnello Panic,

5
Punto chiave punto 3, riavvia IIS Express! Individua l'icona nella barra delle applicazioni e fermala per forzare il riavvio. Non sono sicuro se esiste un modo più elegante. Ma questo ha funzionato per me. Grazie!
Il senatore

9
Se sei troppo pigro per aggiungere ogni combinazione hostname / ipaddress usa un * invece di "your-machine-name"
StarQuake

4
Un altro suggerimento: se si fa clic con il pulsante destro del mouse sull'icona systray di IISExpress, è possibile selezionare "Mostra tutte le applicazioni" per aprire una finestra di dialogo che mostra tutte le applicazioni attualmente in esecuzione localmente. Fai clic con il pulsante destro del mouse sull'applicazione desiderata (non fare clic con il pulsante sinistro del mouse o si aprirà il browser), quindi vedrai "Percorso" e "Config" di seguito. Fare clic con il tasto sinistro del mouse su "Config" e si aprirà il relativo file Applicationhost.config in cui è necessario aggiungere / modificare i collegamenti come descritto sopra. Questo è un modo semplice per individuare la configurazione corrente.
Matt,

31

C'era solo 1 cosa che ha funzionato per me.

usare *:portnumber:*non andava bene. Sì, dopo averlo fatto e assicurandomi che Windows Firewall fosse aperto, sono riuscito a collegarmi alla porta, ma ho comunque visualizzato l'errore "503".

Ho testato alcune cose localmente e ho scoperto che solo http: // localhost ha funzionato. Utilizzando l'indirizzo IP reale (non 127.0.0.1, ma, ad esempio, 192.168.1.50), è stato comunque restituito un 503 anche sul computer locale. Ho provato a utilizzare il nome host reale nei bind, ma IIS Express ha rifiutato di avviarsi. Questo potrebbe effettivamente avere a che fare con la risoluzione del nome host. Non l'ho esplorato ulteriormente.

Alla fine, ho finito per usare questa configurazione:

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

In questo modo, sono stato in grado di connettermi da una macchina remota utilizzando http://192.168.1.50:53351.


Ho riscontrato questo errore esatto, ma non volevo codificare l'IP corrente nella configurazione, poiché può cambiare. Ho scoperto che il carattere jolly funziona sulle parti IP e nome host, quindi ho finito con: <binding protocol="https" bindingInformation="*:44300:*" /> <binding protocol="http" bindingInformation="*:8888:*" /> modifica: ho davvero provato a capire il markdown SO, ho smesso :).
Brian Barker,

19

Dopo aver sprecato più di 3 ore su un argomento così completo, ho deciso di condividere la mia configurazione con te. La mia configurazione è Visual Express 2012 per l'aggiornamento Web 4 su Windows 8. Questo è stato il mio primo ritorno a MS VS da studi (almeno 8 anni) e ora sono sicuro che le regole di Linux. Su Django questo tipo di installazione mi ha richiesto 10 minuti di ricerca della documentazione.

  1. disattivare il firewall per i test

    netsh advfirewall set allprofiles state off
    
  2. i collegamenti di installazione nel mio caso l'indirizzo locale è localIP = 192.168.1.102 (poiché i collegamenti non possono contenere domini non numerici, utilizzalo di seguito invece di mylocaldomain.com, vedi la politica di stackoverflow) in Documents\IISExpress\config\applicationhost.config

    <bindings>
        <binding protocol="http" bindingInformation="*:53351:mylocaldomain.com" />
        <binding protocol="http" bindingInformation="*:53351:localhost" />
    </bindings>
    
  3. aggiungere automaticamente l'esecuzione automatica per il servizio di avvio di ISS Express

    <site name="NeuronCharts" id="2" serverAutoStart="true">
    
  4. Aggiungi alcune strane regole al server http (non so ancora se questo è nesseary)

    netsh http add urlacl url=http://mylocaldomain.com:53351/ user=everyone
    
  5. eseguire IISExpress manualmente non da VS IDE

  6. vedrai che ISSExpress sta registrando i binding
  7. eseguire il browser http://mylocaldomain.com:53351 se funziona, quindi possiamo aggiungere la regola del firewall
  8. aggiungi regola firewall

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

impostare remoteip su any se si desidera accedere al proprio server da un mondo esterno se si desidera accedere alla rete locale utilizzando localsubnet

  1. avviare il firewall

    netsh advfirewall set allprofiles state on
    
  2. controlla di nuovo se tutto funziona su IP locale e pubblico

Ti auguro buona fortuna

Rafal


3
In questo modo IIS Express non poteva più essere eseguito su Win8 con VS2013 senza eseguire VS2013 come amministratore. È causato da IIS Express che ora tenta di aprirsi al traffico esterno a seguito del comando netsh. Inoltre non sono mai stato in grado di farlo effettivamente per servire quel traffico; Avrei un 503. Per invertire il problema causato dal comando netsh in questa risposta, eseguirlo da un prompt dei comandi in esecuzione come amministratore: netsh http delete urlacl url=http://*:55416/(sostituisci la porta con la tua porta)
Chris Moschini,

fwiw - Non ho bisogno del passaggio 4 (la chiamata netsh che @Rafal non è sicuro è necessaria) e, anche se non ho bisogno dell'associazione "localhost" nel passaggio 2 per eseguire i progetti VS2013 nella mia soluzione, la parte anteriore end si carica in modo significativamente più veloce quando quel binding "localhost" viene lasciato in posizione.
Lukkea,

Ho scoperto che seguendo le istruzioni di cui sopra risultava comunque l'utilizzo di 503 localhost. Ho scoperto che il nome del computer guest (Windows) doveva trovarsi nei binding applicationhost.confige sull'host (Mac) il nome del computer guest doveva essere mappato 127.0.0.1in /etc/hosts. Solo allora una richiesta al computer guest sull'host ha avuto successo.
Matt,

Un'aggiunta al passaggio 5. Usa iisexpress.exe / siteid: id dove id è il valore dell'attributo id del tuo sito nell'impostazione <site id = "id">, altrimenti avvierà il 1 ° sito.
Mudit Jain,

9

Abbiamo scoperto che il problema riguardava una cattiva mappatura di urlacl. Per capirlo:

netsh http show urlacl 

e cerca cose come http://+:80/o la porta a cui ti impegni.

Quindi utilizzare

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

Ciò ha risolto il problema per me.


4
dovrebbe essere netsh http delete urlacl url = <l'url dalla lista>, ha funzionato per me grazie!
sergiogx,

1
Questo è discusso in maggior dettaglio sul blog msdn . Questo alla fine era anche il mio problema.
Kevin Scharnhorst,

3
Grazie, la sintassi esatta ènetsh http delete urlacl <yoururl>
yoel halb,

7

Niente ha funzionato per me. Finalmente ho trovato iisexpress-proxy

Vedi la mia risposta https://stackoverflow.com/a/33623399/631527

Un'altra soluzione è ngrok


Sorprendente! Ho provato tutte quelle altre soluzioni e non hanno funzionato neanche. "Richiesta non valida" o "Servizio non disponibile". Troppo complicato. Ho installato il modulo del nodo ed eseguito, funziona immediatamente !!
TetraDev,

LAVORI! santo! Grazie!
Ayson Baxter,

dai un'occhiata anche a ngrok
Toolkit

1
Funziona SEMPLICEMENTE come un fascino con ngrok! È strano dover prima instradare da localhost a iis-proxy e poi da proxy a ngrok, ma ehi, ha funzionato !. Ad esempio, ho il mio iisexpress sulla porta 3028. Ho corso iisexpress-proxy 3028 to 12345e poi ./ngrok.exe http 12345. 😅
Reuel Ribeiro,

@TetraDev, la "Richiesta non valida" o "Servizio non disponibile" era perché l'intestazione host ricevuta quando si accedeva a localhost da ngrok non era un localhost come spiegato qui
Dani Torres

3

Ciò che mi ha aiutato è stato fare clic con il pulsante destro del mouse sull'icona "IISExpress", "Mostra tutte le applicazioni". Quindi selezionando il sito Web e ho visto quale aplicationhost.config utilizza e la correzione è andata perfettamente.

Configurazione IISExpress


1

Il problema sta aggiornando il file applicationhost.config nella cartella Web anziché nella soluzione. Il file di configurazione della soluzione è quello da modificare


1

Dopo la soluzione di @vikomall, non dimenticare di avviare VS come amministratore. Questo ha risolto il problema per me.


0

Per quanto riguarda la risposta di Anthony Rizzolo: in Windows 8.1, ho dovuto digitare così:

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

Per esempio:

netsh http delete urlacl url=http://+:8689/

0

Nessuna delle risposte sopra ha funzionato per me.

Ho avuto due voci in netsh per lo stesso servizio

netsh http show urlacl

inserisci qui la descrizione dell'immagine

Uno utilizza un carattere jolly forte, l'altro utilizza un carattere jolly debole.

Rimuovere quello con il carattere jolly debole ha fatto il lavoro.

Maggiori informazioni sul carattere jolly forte e debole nel contesto di netsh

Quando l'elemento host di un UrlPrefix è costituito da un singolo segno più (+), UrlPrefix corrisponde a tutti i possibili nomi host nel contesto del suo schema, degli elementi port e relativeURI e rientra nella categoria di caratteri jolly forti.

Quando un asterisco (*) appare come elemento host, UrlPrefix rientra nella categoria dei caratteri jolly deboli. Questo tipo di UrlPrefix corrisponde a qualsiasi nome host associato allo schema, alla porta e al relativoURI specificati a cui non è già stata associata una UrlPrefix con caratteri jolly forti, espliciti o con caratteri jolly deboli. Questa specifica host può essere utilizzata come catch-all predefinito in alcune circostanze, oppure può essere utilizzata per specificare un'ampia sezione dello spazio dei nomi URL senza dover utilizzare molti UrlPrefix.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.