IIS Express: consentire l'accesso da connessioni remote (external requests)

IIS URL Rewrite: redirect di più nomi di dominio su un singolo hostname

A partire da Visual Studio 2012 il venerando web server di sviluppo Cassini è stato rimpiazzato da IIS Express. Questo cambiamento, che secondo la Microsoft ha il merito di aver notevolmente semplificato le cose ai nuovi sviluppatori, ha provocato la scomparsa - per ragioni di sicurezza - di alcune importanti opzioni di configurazione, tra cui la possibilità di cambiare il local hostname e la porta HTTP mediante la GUI (tramite la finestra Proprietà dell'applicazione web). Come se non bastasse la configurazione predefinita di IIS Express, a differenza di quella di Cassini, non consente di rispondere a request esterne, ovvero effettuate da altri dispositivi collegati tramite rete.

HTTP Error 503. The service is unavailable.

OUCH!.Don.Draper

Si tratta di una limitazione particolarmente grave, specialmente in un periodo come quello attuale in cui, stante la grande diffusione di siti responsive, pagine mobile-friendly e webapp, effettuare test su dispositivi diversi si rivela spesso un'operazione fondamentale fin dalle prime fasi dello sviluppo.

Il Problema.

I motivi che impediscono a IIS Express di rispondere a richieste esterne sono generalmente tre:

  1. Il file di configurazione predefinito, che contiene i riferimenti ad ogni applicazione web nel momento in cui questa viene attivata in Debug o in Release mode da Visual Studio.
  2. I criteri di accesso predefiniti (ACL) previsti per le connessioni al componente HTTP.SYS, che non consentono a un'applicazione dotata di privilegi standard - come Visual Studio eseguito normalmente, ovvero senza privilegi di amministratore - di gestire traffico esterno.
  3. Il Firewall di Windows (o altro firewall installato sul sistema), che con tutta probabilità non è configurato per consentire connessioni esterne in ingresso dalla porta TCP assegnata automaticamente all'applicazione web.

La Soluzione.

Vediamo come risolvere tutti questi problemi:

  • Assicuratevi di non avere istanze di Visual Studio aperte.
  • Aprite il file  %userprofile%\Documenti\IISExpress\config\applicationhost.config  , dove %userprofile% corrisponde alla cartella che ospita il profilo del vostro utente - ad esempio C:\Users\NomeUtente\
  • Cercate la entry corrispondente all'applicazione web che vogliamo modificare e cambiamo le configurazioni di binding nel seguente modo:
    <binding protocol="http" bindingInformation="*:<port>:*" /> In buona sostanza si tratta di sostituire una coppia di localhost con altrettanti asterischi, lasciando inalterata la porta assegnata automaticamente (che troverete al posto di <port>). Se avete necessità di cambiare anche quest'ultima, sostituitela con una porta TCP a piacere (es. 8080) ed eseguite anche il prossimo passaggio, in caso contrario potrete saltare direttamente allo step successivo.
  • Se avete cambiato la porta, aprite il file di progetto (.csproj) e il file di soluzione (.sln) corrispondenti alla vostra applicazione web e assicuratevi che non vi siano riferimenti alla porta precedente: è possibile che siano presenti o meno a seconda del tipo di progetto (Web Application, MVC App, Web Site, etc.).  In caso affermativo, sostituite la vecchia porta con la nuova.
  • Aprite un Prompt dei Comandi (con privilegi di Amministratore) e digitate il seguente comando:
    netsh http add urlacl url=http://*:<port>/ user=everyone Inserendo ovviamente la porta dell'applicazione web al posto di <port>. Nel caso in cui riceviate un messaggio di errore (1789) significa che il gruppo Everyone non è presente nel vostro sistema, cosa che può accadere in alcune localizzazioni di Windows. Se è il vostro caso, sostituite everyone con il nome del gruppo corrispondente. In alternativa ad effettuare questo passaggio potete provare ad eseguire Visual Studio con privilegi di amministratore.
  • Abilitate il traffico interno dell'applicazione IISExpress.exe mediante il pannello di configurazione avanzata di Windows Firewall (o altro Firewall installato) o, in alternativa, aprite il traffico interno per la porta TCP corrispondente a quella della vostra applicazione.

Una volta fatto tutto questo potrete lanciare nuovamente Visual Studio e lanciare la vostra applicazione in Debug o Release mode:  dovreste essere in grado di accedervi da qualsiasi dispositivo collegato alla vostra stessa rete al seguente indirizzo web:

http://<lan-ip-address>:<port>/

Visual Studio 2015 Update

Come giustamente indicato da Zachary Pittman (a cui vanno i nostri ringraziamenti), la versione di IIS Express installata con Visual Studio 2015 crea un file applicationhost.config specifico per ciascun progetto web: tale file si trova nella sottocartella   /.vs/ , situata all'interno della cartella principale del progetto. In ogni caso, per determinare l'esatta collocazione del file, è sempre possibile fare click con il tasto destro sull'icona di IIS Express presente nel system tray: da lì è possibile selezionare > Show all applications e visualizzare il percorso del file applicationhost.config relativo al proprio progetto.

Le Alternative.

Diciamolo pure: IIS Express, con tutte le sue limitazioni, è ben lontano dall'essere uno strumento di lavoro perfetto. Chiunque sentisse la necessità di dotarsi di un web server più completo, robusto e configurabile troverà senz'altro maggiori soddisfazioni nel passare a IIS 7.5 o superiore. Il problema è che potreste essere obbligati anche in questo caso ad eseguire Visual Studio come amministratori di sistema per non incorrere nel seguente errore:

4743_error

In quanto Visual Studio ha bisogno di accedere alla IIS metabase, privilegio negato a tutti gli account standard.

OUCH!.Don.Draper

UPDATE: In alternativa ad eseguire Visual Studio con privilegi di amministratore potete utilizzare il workaround descritto in questo articolo, che consente di impostare i permessi di accesso alla IIS Metabase per l'utente corrente in modo semplice ed efficace.

Cos'altro dire? Felice (si fa per dire) sviluppo!

EDIT: Per chiunque volesse approfondire l'argomento IIS Express e comprendere le ragioni che hanno portato la Microsoft a renderlo il successore di Cassini suggerisco questo ottimo (anche se datato) articolo di Scott Hanselman, ovviamente in inglese. Buona lettura!

About Ryan

IT Project Manager, Web Interface Architect e Lead Developer di numerosi siti e servizi web ad alto traffico in Italia e in Europa. Dal 2010 si occupa anche della progettazione di App e giochi per dispositivi Android, iOS e Mobile Phone per conto di numerose società italiane. Microsoft MVP for Development Technologies dal 2018.

View all posts by Ryan

3 Comments on “IIS Express: consentire l'accesso da connessioni remote (external requests)”

  1. Pingback: Unable to access the IIS metabase: come risolvere
  2. Pingback: Impossibile avviare il debug sul server Web con VS 2015 - Come risolvere
  3. Pingback: Process with an ID #### is not running con VS 2015 - Come risolvere

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *


The reCAPTCHA verification period has expired. Please reload the page.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.