Self hosted OWIN e urlacl

Ho creato un’applicazione autoalimentata Nancy / SignalR ospitata in OWIN usando Microsoft.Owin.Host.HttpListener e Microsoft.Owin.Hosting

Le cose funzionano perfettamente bene localmente ma non appena provo a utilizzare qualsiasi cosa tranne localhost per accedere all’app ottengo un HTTP Error 503. The service is unavailable errore. Non riesco nemmeno ad accedere all’app utilizzando 127.0.0.1 o il nome del computer.

Ho provato ad aggiungere la porta a urlacl usando

http add urlacl http://*:8989/ user=EVERYONE ma non sembra fare nulla.

ecco le opzioni di avvio di OWIN che ho provato,

  var options = new StartOptions { Url = "127.0.0.1", App = GetType().AssemblyQualifiedName, Port = _configFileProvider.Port }; var options = new StartOptions { App = GetType().AssemblyQualifiedName, Port = _configFileProvider.Port }; 

ecco il codice sorgente per il file che avvia e arresta il server https://github.com/NzbDrone/NzbDrone/blob/vnext/NzbDrone/Owin/OwinHostController.cs

quindi risulta che è necessario passare un URL in StartOptions nello stesso formato di urlacl.

La modifica delle opzioni di avvio del codice riportato di seguito ha risolto il problema. ora l’app è accessibile attraverso la rete.

  var options = new StartOptions("http://*:8989") { ServerFactory = "Microsoft.Owin.Host.HttpListener" }; 

Trascorro molte ore a risolvere problemi simili su Windows 8.1.

  StartOptions options = new StartOptions(); options.Urls.Add("http://localhost:9000"); options.Urls.Add("http://127.0.0.1:9000"); options.Urls.Add("http://192.168.0.102:9000"); options.Urls.Add(string.Format("http://{0}:9000", Environment.MachineName)); WebApp.Start(options); 

Non ho potuto ascoltare o ho ricevuto l’errore 503 …

Se si desidera ascoltare su diversi indirizzi IP, ogni indirizzo ha bisogno del proprio record urlacl:

Non funziona:

  netsh http>add urlacl http://+:9000/ user=EveryOne 

OK:

  netsh http>add urlacl http://localhost:9000/ user=EveryOne netsh http>add urlacl http://127.0.0.1:9000/ user=EveryOne etc. 

Dopo aver aggiunto la prenotazione per ciascun indirizzo individualmente, tutto funziona correttamente.

Grazie alle informazioni che @ kay.one ha fornito, sono riuscito ad accedere alla mia API Web self-hosted 2.2 (OWIN / Katana, app per console) dalla stessa macchina tramite l’indirizzo IP. Tuttavia, basta consolidarlo in una semplice procedura dettagliata:

  1. In Main of Program.cs (per app console): WebApp.Start("http://*:8080");
  2. Da Prompt dei comandi di Windows (esegui come amministratore) inserisci netsh http add urlacl http://*:8080/ user=EVERYONE
  3. Vai a Windows Firewall con sicurezza avanzata e aggiungi una regola in entrata che apre la porta TCP 8080

Dovresti quindi essere in grado di accedere da un’altra macchina usando l’indirizzo IP o il nome del computer.

Disclaimer: non sono un esperto di sicurezza quindi non conosco le implicazioni sulla sicurezza di questo.