2015-12-10 9 views
49

Ho distribuito la mia app C#, asp.net 5, mvc 6 su un server Windows 2008. Ho sparato dnx web e sta ascoltando la porta 5000 e funziona bene quando si accede dal computer locale.Come posso ottenere che il server Web di Kestrel ascolti le richieste di non localhost?

Come ottengo per ascoltare le richieste di non localhost?

P.S. Questo question non è un duplicato di questo ... si riferisce ad asp.net pre RC1 quando hosting.ini aveva effettivamente un formato .ini. Ora, è JSON e non riesco a trovare alcuna documentazione su cosa dovrebbe esserci effettivamente.

P.P.S. La vera soluzione è nello answer non accettato alla domanda collegata, con un avvertimento notevole. Passi:

  1. Modificare project.json per la risposta collegata.
  2. Pubblica il tuo progetto sul tuo server.
  3. Sul server, passare a ... \ approot \ src \ cartella YourProject e aprire una finestra di comando lì.
  4. Run dnx web - fallirà
  5. Run dnu restore
  6. Run 'DNU build`
  7. Run' dnx web` - il server web dovrebbe ora iniziare bene file di configurazione
+0

Possibile duplicato del [ASP.NET 5 Kestrel collegare all'interno della LAN] (http://stackoverflow.com/questions/33975949/asp-net-5-kestrel-connect-within-lan) –

+0

Bene, la seconda risposta nella domanda collegata si riferisce al formato JSON. Non è utile neanche per te? –

+0

@chuex L'ho provato e inizialmente ha bloccato il server Web all'avvio. Non so perché. Quindi ho eseguito 'dnu restore', seguito da' dnu build' e quindi 'dnx web' ha avviato correttamente il web server. Non so perché accada, ma almeno sono in grado di farlo funzionare. C'è sicuramente un bug che deve essere affrontato prima della versione finale. Per ora, questa è la soluzione. – AngryHacker

risposta

75

Il predefinito usato da Il server Kestrel è hosting.json. Il nome è stato cambiato più volte in diverse versioni beta. Se si utilizza ora project.json con il seguente "command" sezione

"commands": { 
    "web": "Microsoft.AspNet.Server.Kestrel" 
} 

poi durante l'avvio del server dalla riga di comando per

dnx web 

il file hosting.json verrà letto. Il file

{ 
    "server.urls": "http://0.0.0.0:5000" 
} 

configurerà il server per l'ascolto di 5000 su ogni indirizzo IP4. La configurazione

{ 
    "server.urls": "http://::5000;http://0.0.0.0:5000" 
} 

informa di ascoltare 5000 su entrambi gli indirizzi IP4 e IP6.

È possibile specificare i file di configurazione alternativi utilizzando la variabile di ambiente ASPNET_ENV o l'utilizzo di --config myconfig1.json (o config=myconfig1.json). Ad esempio è possibile utilizzare

SET ASPNET_ENV=Development 

e per creare hosting.Development.json file con configurazione specifica. In alternativa è possibile utilizzare project.json con

"commands": { 
    "web": "Microsoft.AspNet.Server.Kestrel" 
    "webProd": "Microsoft.AspNet.Server.Kestrel --config prod.json" 
} 

e avviare il server in base all'utilizzo

dnx webProd 

devo ricordare inoltre che potrebbe essere necessario che si consente di ascoltare in aggiunta e per iscriversi (per iniziare dnx web) .È richiesto a causa del firewall e della sicurezza locale per l'ascolto di nuove porte TCP/HTTP. Qualcosa di simile al di sotto dovrebbe fare la registrazione locale e l'ascolto di 5000 porta per tutti (IPv4 e IPv6):

netsh http add iplisten ipaddress=0.0.0.0:5000 
netsh http add iplisten ipaddress=::5000 
netsh http add urlacl url=http://+:5000/ user=\Everyone 

Per essere più sicuro è possibile regolare la configurazione di cui sopra per concedere i diritti minimi.

AGGIORNATO: Grazie a @BlaneBunderson. Si può usare * invece di un indirizzo IP (come http://*:5000) per ascoltare su qualsiasi indirizzo IP4 e IP6 da qualsiasi interfaccia. Uno dovrebbe essere attentamente e non usare http://*:5000;http://::5000, http://::5000;http://*:5000, http://*:5000;http://0.0.0.0:5000 o http://*:5000;http://0.0.0.0:5000 perché richiede di registrare IP6 indirizzo :: o l'indirizzo IP4 0.0.0.0due volte.

Corrisponde a the announcement

Tecnicamente, qualsiasi nome host che non è "localhost" o un IPv4 valido o indirizzo IPv6 causerà Kestrel di legarsi a tutte le interfacce di rete.

Penso che il comportamento potrebbe essere modificato in futuro. Quindi consiglierei di utilizzare solo il modulo , 0.0.0.0:5000 e ::5000 per la registrazione di qualsiasi indirizzo IT.

AGGIORNAMENTO 2: modifiche ASP.NET core RC2 (vedi the announcement) il comportamento di caricare le impostazioni predefinite. È necessario apportare modifiche allo Main per caricare le impostazioni da hosting.json e ai parametri della riga di comando. Di seguito un esempio di utilizzo

public static void Main(string[] args) 
{ 
    var config = new ConfigurationBuilder() 
     .SetBasePath(Directory.GetCurrentDirectory()) 
     .AddJsonFile("hosting.json", optional: true) 
     .AddEnvironmentVariables(prefix: "ASPNETCORE_") 
     .AddCommandLine(args) 
     .Build(); 

    var host = new WebHostBuilder() 
     .UseUrls("http://*:1000", "https://*:1234", "http://0.0.0.0:5000") 
     .UseEnvironment("Development") 
     .UseConfiguration(config) 
     .UseKestrel() 
     .UseContentRoot(Directory.GetCurrentDirectory()) 
     .UseIISIntegration() 
     .UseStartup<Startup>() 
     .Build(); 

    host.Run(); 
} 

L'uso codice sopra tre attacchi: "http://*:1000", "https://*:1234", "http://0.0.0.0:5000" di default invece di utilizzo della porta predefinita 5000 per default (per l'esattezza l'utilizzo di http://localhost:5000). La chiamata di .UseConfiguration(config) viene effettuata dopo.UseUrls. Pertanto la configurazione caricata da hosting.json o dalla riga di comando sovrascrive le opzioni predefinite. Se si rimuove la riga .SetBasePath(Directory.GetCurrentDirectory()), lo hosting.json verrà caricato dalla stessa directory in cui verrà compilata la DLL dell'applicazione (ad esempio bin\Debug\netcoreapp1.0).

Si può utilizzare l'esecuzione come

dotnet.exe run --server.urls=http://0.0.0.0:5000 

per sovrascrivere le impostazioni di default (da UseUrls) e le impostazioni da "server.urls" proprietà di hosting.json se è esiste.

Allo stesso modo si potrebbe sovrascrivere le impostazioni ULR impostando la variabile d'ambiente

set ASPNETCORE_SERVER.URLS=http://localhost:12541/ 

quindi l'inizio predefinita dell'applicazione utilizzando dotnet.exe run utilizzerà http://localhost:12541/ per il legame.

È possibile trovare here un esempio dell'utilizzo del collegamento HTTPS.

+1

Inoltre puoi usare "server.urls": "http: // *: 5000" invece di "server.urls": "http://0.0.0.0:5000" (Personalmente penso che * faccia un po 'di più senso.) –

+0

@BlaneBunderson: Grazie per il tuo suggerimento! Devo aggiungere che 'http: // *: 5000' è uguale a' http: // :: 5000; http: //0.0.0.0: 5000' e non 'http: //0.0.0.0: 5000' . Forza l'ascolto sia per IPv4 che per IPv6. Puoi verificarlo con l'uso di 'http: // *: 5000; http: // :: 5000' o' http: // :: 5000; http: // *: 5000'. Si ottiene l'errore "Microsoft.AspNet.Server.Kestrel.Networking.UvException: Errore -4091 indirizzo EADDRINUSE già in uso" durante la registrazione del secondo indirizzo. In alcuni scenari la registrazione di IPv4 e IPv6 è buona, in altri scenari non va bene. In ogni caso è bene menzionare il modo. – Oleg

+0

Eccellente aggiornamento per RC2, grazie per la spiegazione dettagliata – Trygve

24

In RC2 la sezione comandi di project.json non è più utilizzata. Non ho ancora ottenuto Kestrel per raccogliere l'hosting.json, ma puoi impostare la porta in modo programmatico nella parte principale dell'applicazione dove viene creato e configurato il nuovo WebHostBuilder. Basta aggiungere .UseUrls() metodo come nel campione sotto

public static void Main(string[] args) 
    { 
     var host = new WebHostBuilder() 
      .UseUrls("http://0.0.0.0:5000/") 
      .UseKestrel() 
      .UseContentRoot(Directory.GetCurrentDirectory()) 
      .UseIISIntegration() 
      .UseStartup<Startup>() 
      .Build(); 

     host.Run(); 
    } 
+2

Questo è stato di grande aiuto. Ho usato '.UseUrls (" http: // *: 5000 ")' invece, e porto inoltrato 5000 con IP Host vuoto su VirtualBox, e infine posso arrivare agli endpoint .NET Core ospitati da Docker dal mio Mac. Dolce! –

+0

Per informazioni sull'uso di hosting.json in RC2 e una spiegazione più dettagliata, leggere la risposta di Oleg sopra, in particolare "Aggiornato 2" – Trygve

+2

Applicabile anche a 1.0.0-preview2-003121, immagine finestra mobile – linquize

4

Se si sta tentando di mettere un'applicazione ASP.NET core all'interno di un contenitore finestra mobile (che è stato il mio caso d'uso per la necessità di ascoltare gli indirizzi non localhost), nota che questo caso d'uso è già stato preparato per te da Microsoft. Potete vedere la gloria allo https://hub.docker.com/r/microsoft/aspnetcore/

A corrente (v1.0.1) la chiave magica per risolvere questo problema è che il Dockerfile di origine contiene un'impostazione della variabile di ambiente url e l'applicazione non tenta di sovrascriverlo. (In effetti, un'applicazione container dovrebbe valere internamente il meno possibile l'ambiente in cui verrà eseguito.)

ENV ASPNETCORE_URLS http://+:80 

Nota il segno più, piuttosto che asterisco lì. In realtà raccomando di visitare il link sopra dockerhub leggendo la mia risposta fino a quando il link è buono. La versione 1.1 è dietro l'angolo e le cose potrebbero cambiare in futuro.

Quando si esegue il contenitore, assicurarsi di esporre la porta guest 80, in base all'impostazione della variabile di ambiente. Per esempio:

docker run -d -p 8000:80 myapp 
curl localhost:8000