Wie bringe ich den Turmfalken-Webserver dazu, nicht-lokale Host-Anfragen abzuhören?

82

Ich habe meine App c #, asp.net 5, mvc 6 auf einem Windows 2008-Server bereitgestellt. Ich habe gestartet dnx webund es hört Port 5000 ab und funktioniert einwandfrei, wenn vom lokalen Computer aus zugegriffen wird.

Wie kann ich nicht-lokale Host-Anfragen abhören?

PS Diese Frage ist kein Duplikat davon ... sie bezieht sich auf asp.net vor RC1, wenn hosting.ini tatsächlich ein INI-Format hatte. Jetzt ist es JSON und ich kann keine Dokumentation darüber finden, was eigentlich darin sein sollte.

PPS Die eigentliche Lösung liegt in der nicht akzeptierten Antwort auf die verknüpfte Frage mit einer massiven Einschränkung. Schritte:

  1. Ändern Sie Ihre project.json gemäß der verknüpften Antwort.
  2. Veröffentlichen Sie Ihr Projekt auf Ihrem Server.
  3. Wechseln Sie auf dem Server in den Ordner ... \ approxot \ src \ YourProject und öffnen Sie dort ein Befehlsfenster.
  4. Ausführen dnx web- es wird fehlschlagen
  5. Lauf dnu restore
  6. Führen Sie 'dnu build' aus
  7. Führen Sie 'dnx web` aus - der Webserver sollte jetzt einwandfrei starten

PS Für Leute, die diese Frage unterstützen. Es ist veraltet. Sehr schlecht veraltet!

Dies galt für die frühen Versionen von .NET Core. Die Frage und die Antworten gelten sicherlich nicht für die aktuellen Versionen des Frameworks (z. B. 2.x, 3.x).

AngryHacker
quelle
Mögliches Duplikat von ASP.NET 5 Kestrel Connect innerhalb von LAN
chue x
Nun, die zweite Antwort in der verknüpften Frage bezieht sich auf das JSON-Format. Es ist auch nicht nützlich für dich?
Chue x
@chuex Ich habe das versucht und anfangs stürzte der Webserver beim Start ab. Nicht sicher warum. Dann habe ich den Webserver dnu restoregefolgt dnu buildund dann dnx webrichtig gestartet. Ich weiß nicht, warum es passiert, aber zumindest kann ich es zum Laufen bringen. Es gibt definitiv einen Fehler, der vor der endgültigen Veröffentlichung behoben werden muss. Im Moment ist dies die Problemumgehung.
AngryHacker
1
Ich habe nach Fragen bearbeitet, um die Lösung wiederzugeben.
AngryHacker
@AngryHacker: Sie können server.urlsParameter in der Anwendungskonfigurationsdatei oder in Befehlszeilenparametern angeben . Der Wert kann mehrere durch Semikolons getrennte Werte haben (siehe hier) . Der Dateiname der Konfiguration kann hosting.json sein , aber nicht nur json: siehe Problem . --configkann verwendet werden, um den Namen der Konfigurationsdatei anzugeben
Oleg

Antworten:

112

Die vom Kestrel-Server verwendete Standardkonfigurationsdatei lautet hosting.json. Der Name wurde in verschiedenen Beta-Versionen mehrfach geändert. Wenn Sie jetzt project.jsonmit dem folgenden "command"Abschnitt verwenden

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

dann beim Starten des Servers über die Kommandozeile von

dnx web

Die Datei hosting.jsonwird gelesen. Die Datei

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

konfiguriert den Server so, dass bei jeder IP4-Adresse 5000 abgehört werden. Die Konfiguration

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

informiert, um 5000 sowohl auf IP4- als auch auf IP6-Adresse abzuhören.

Alternative Konfigurationsdateien können durch die ASPNET_ENVUmgebungsvariable der Verwendung oder durch die Verwendung von --config myconfig1.json(oder config=myconfig1.json) angegeben werden. Zum Beispiel können Sie verwenden

SET ASPNET_ENV=Development

und um eine hosting.Development.jsonDatei mit einer bestimmten Konfiguration zu erstellen . Alternativ können Sie project.jsonmit verwenden

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

und starten Sie den Server durch Verwendung

dnx webProd

Ich muss zusätzlich daran erinnern, dass es erforderlich sein kann, dass Sie zusätzlich zuhören und sich registrieren lassen (um zu beginnen dnx web). Dies ist aufgrund der Firewall und der lokalen Sicherheit beim Abhören neuer TCP / HTTP-Ports erforderlich. Etwas wie das Folgende sollte die lokale Registrierung und das Abhören von 5000 Ports für alle (IPv4 und IPv6) ermöglichen:

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

Um sicherer zu sein, können Sie die obige Konfiguration anpassen, um minimale Rechte zu gewähren.

AKTUALISIERT: Danke @BlaneBunderson. Man kann * statt IP - Adresse verwenden (wie http://*:5000) auf hört irgendwelche IP4 und IP6 Adressen von jeder Schnittstelle. Man sollte vorsichtig sein und diese nicht benutzen

  • http://*:5000;http://::5000
  • http://::5000;http://*:5000
  • http://*:5000;http://0.0.0.0:5000
  • http://*:5000;http://0.0.0.0:5000

weil es erforderlich ist, die IP6-Adresse ::oder die IP4-Adresse 0.0.0.0 zweimal zu registrieren .

Entspricht der Ankündigung

Technisch gesehen führt jeder Hostname, der nicht "localhost" oder eine gültige IPv4- oder IPv6-Adresse ist, dazu, dass Kestrel an alle Netzwerkschnittstellen gebunden wird.

Ich denke, dass das Verhalten in Zukunft geändert werden könnte. So würde ich empfehlen , nur zu verwenden *:5000, 0.0.0.0:5000und ::5000für die Registrierung von jeder IT - Adresse zu bilden.

AKTUALISIERT 2: ASP.NET Core RC2 ändert (siehe Ankündigung ) das Verhalten beim Laden der Standardeinstellungen. Man muss Änderungen an der vornehmen Main, um die Einstellungen hosting.jsonund die Befehlszeilenparameter zu laden . Unten finden Sie ein Beispiel für die Verwendung

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();
}

Die obige Code verwendet drei Bindungen: "http://*:1000", "https://*:1234", "http://0.0.0.0:5000"standardmäßig anstelle der Nutzung (sein um genau die Verwendung des Standard - Port 5000 standardmäßig http://localhost:5000). Der Anruf von .UseConfiguration(config)erfolgt nach .UseUrls . Daher hosting.jsonüberschreibt die von der Konfiguration geladene Konfiguration oder die Befehlszeile die Standardoptionen. Wenn Sie eine .SetBasePath(Directory.GetCurrentDirectory())Zeile entfernen , hosting.jsonwird diese aus demselben Verzeichnis geladen, in dem die Anwendungs-DLL kompiliert wird (zum Beispiel bin\Debug\netcoreapp1.0).

Man kann Ausführung wie verwenden

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

um die Standardeinstellungen (von UseUrls) und die Einstellungen von der "server.urls"Eigenschaft zu überschreiben, hosting.jsonfalls vorhanden.

Auf die gleiche Weise könnte man die ULR-Einstellungen überschreiben, indem man die Umgebungsvariable setzt

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

dann der Standard der Anwendung beginnen dotnet.exe runwird verwenden http://localhost:12541/für die Bindung.

Sie können finden hier ein Beispiel für die Verwendung von HTTPS - Bindung.

HINWEIS: Der Name der Umgebungsvariable wird von geändert ASPNETCORE_SERVER.URLSzu ASPNETCORE_URLSspäteren Versionen von ASP.NET (siehe hier die Dokumentation von ASP.NET - Core 3.1).

Oleg
quelle
1
Außerdem können Sie "server.urls": "http: // *: 5000" anstelle von "server.urls": " 0.0.0.0:5000 " verwenden (Ich persönlich halte das * für etwas sinnvoller.)
Blane Bunderson
@BlaneBunderson: Danke für deinen Vorschlag! Ich muss hinzufügen, dass http://*:5000das das gleiche ist wie http://::5000;http://0.0.0.0:5000und nicht http://0.0.0.0:5000. Es erzwingt das Abhören von IPv4 und IPv6. Sie können es durch Verwendung http://*:5000;http://::5000oder überprüfen http://::5000;http://*:5000. Beim Registrieren der zweiten Adresse wird der Fehler "Microsoft.AspNet.Server.Kestrel.Networking.UvException: Fehler -4091 EADDRINUSE-Adresse wird bereits verwendet" angezeigt. In einigen Szenarien ist die Registrierung von IPv4 und IPv6 gut, in anderen Szenarien nicht gut. In jedem Fall ist es gut, den Weg zu erwähnen.
Oleg
Ausgezeichnetes Update für RC2, danke für die ausführliche Erklärung
Trygve
würden Sie in Ihrem Beispiel "Update 2" nicht .UseStartup<Startup>()überschreiben .UseConfiguration(config)?
Nicks
Es gibt einen Tippfehler in dieser Umgebungsvariablen, es sollte ASPNETCORE_URLS sein
nrjohnstone
33

In RC2 wird der Befehlsabschnitt von project.json nicht mehr verwendet. Ich habe Kestrel noch nicht dazu gebracht, die Datei hosting.json zu übernehmen, aber Sie können den Port programmgesteuert im Main der Anwendung festlegen, in der der neue WebHostBuilder erstellt und konfiguriert wird. Fügen Sie einfach die .UseUrls () -Methode wie im folgenden Beispiel hinzu

    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();
    }
Trygve
quelle
3
Das war eine große Hilfe. Ich habe .UseUrls("http://*:5000")stattdessen verwendet und 5000 mit leerer Host-IP auf VirtualBox weitergeleitet, und schließlich kann ich von meinem Mac aus auf die von Docker gehosteten .NET Core-Endpunkte zugreifen. Süss!
Mark Larter
Für Informationen zur Verwendung von hosting.json in RC2 und eine ausführlichere Erklärung lesen Sie Olegs Antwort oben, insbesondere "Updated 2"
Trygve
2
Gilt auch für 1.0.0-Vorschau2-003121, Docker-Bild
Linquize
16

Wenn Sie asp.net core 2.1 + verwenden, ändern Sie den Konfigurationsabschnitt in appsettings.json.

"Kestrel": {
  "EndPoints": {
    "Http": {
      "Url": "http://0.0.0.0:5002"
    }
  }
},
Menxin
quelle
Dieser hat auch für mich durchweg funktioniert, wenn ich von VS Code oder Visual Studio für Mac aus lief. ASPNETCORE_URLShat bei mir nicht funktioniert
JSancho
9

Wenn Sie versuchen, eine ASP.NET Core-Anwendung in einen Docker-Container zu stellen (dies war mein Anwendungsfall für das Abhören von nicht lokalen Hostadressen), beachten Sie, dass dieser Anwendungsfall bereits von Microsoft für Sie zusammengestellt wurde. Sie können den vollen Ruhm unter https://hub.docker.com/r/microsoft/aspnetcore/ sehen.

Derzeit (v1.0.1) besteht die Schlüsselmagie zur Lösung dieses Problems darin, dass die Quell-Docker-Datei eine URL-Umgebungsvariableneinstellung enthält und die Anwendung nicht versucht, diese zu überschreiben. (In der Tat sollte eine containerisierte Anwendung intern so wenig wie möglich über die Umgebung aussagen, in der sie ausgeführt wird.)

ENV ASPNETCORE_URLS http://+:80

Beachten Sie dort das Pluszeichen und nicht das Sternchen. Ich empfehle tatsächlich, den obigen Dockerhub-Link zu besuchen, anstatt meine Antwort zu lesen, solange der Link gut ist. Version 1.1 steht vor der Tür und die Dinge könnten sich in Zukunft wieder ändern.

Stellen Sie beim Ausführen des Containers sicher, dass der Gastport 80 gemäß der Einstellung der Umgebungsvariablen verfügbar gemacht wird. Beispielsweise:

docker run -d -p 8000:80 myapp
curl localhost:8000
GrandOpener
quelle
1
Dies war auch mein Anwendungsfall und der Link war äußerst hilfreich. Danke dir.
Oxymoron
2

Fügen Sie für AspNetCore 3.1+ einfach die folgende Zeile in die Datei ein appsettings.json:

"Urls": "http://*:80"
Ludovic Feltz
quelle
0

Setzen Sie die Umgebungsvariable ASPNETCORE_URLSauf http://0.0.0.0:5000/.

Wenn Sie in Visual Studio ausgeführt werden, fügen Sie die Umgebungsvariable auf der Registerkarte Debug der Projekteigenschaften hinzu.

Edward Brey
quelle