Wie kann der Port angegeben werden, auf dem eine ASP.NET Core-Anwendung gehostet wird?

191

Bei Verwendung WebHostBuilderin aMainWie kann ich bei Einstiegspunkt den Port angeben, an den er gebunden ist?

Standardmäßig werden 5000 verwendet.

Beachten Sie, dass diese Frage spezifisch für die neue ASP.NET Core-API ist (derzeit in 1.0.0-RC2).

Drew Noakes
quelle
10
prüft launchSettings.jsonvon PropertiesOrdnern. Sie können den Port in der ändern launchUrl.
Oleg
@Oleg, ich hatte einige IIS-bezogene Einstellungen aus der RC1-Projektvorlage übrig. Sie hatten keine Wirkung.
Drew Noakes
Man kann verwenden hosting.json(siehe die Antwort ), die standardmäßig in RC1 verwendet wurden und man muss nur hinzufügen .AddJsonFile("hosting.json", optional: true)(siehe hier )
Oleg
1
Die Verwendung des Konfigurationsstapels scheint in der Tat viel besser zu sein, als sich auf einen rein VS-spezifischen Mechanismus (launchSettings.json) zu verlassen.
Kévin Chalet
@DrewNoakes: Ich habe meine alte Antwort mit UPDATED 2 Teil angehängt . Es werden einige Variationen beim Ändern des Standardports und der Verwendung von hosting.jsonoder der Befehlszeile zum Konfigurieren der Bindung beschrieben.
Oleg

Antworten:

233

In ASP.NET Core 3.1 gibt es vier Möglichkeiten, einen benutzerdefinierten Port anzugeben:

  • Starten Sie Ihre .NET-Anwendung mithilfe von Befehlszeilenargumenten mit --urls=[url]:
dotnet run --urls=http://localhost:5001/
  • Verwenden appsettings.jsondurch Hinzufügen eines UrlsKnotens:
{
  "Urls": "http://localhost:5001"
}
  • Verwenden von Umgebungsvariablen mit ASPNETCORE_URLS=http://localhost:5001/.
  • Verwenden Sie UseUrls(), wenn Sie es lieber programmgesteuert ausführen möchten:
public static class Program
{
    public static void Main(string[] args) =>
        CreateHostBuilder(args).Build().Run();

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(builder =>
            {
                builder.UseStartup<Startup>();
                builder.UseUrls("http://localhost:5001/");
            });
}

Oder wenn Sie immer noch den Webhost-Builder anstelle des generischen Host-Builders verwenden:

public class Program
{
    public static void Main(string[] args) =>
        new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>()
            .UseUrls("http://localhost:5001/")
            .Build()
            .Run();
}
Kévin Chalet
quelle
40
Die Verwendung fester URLs direkt im Code ist meiner Meinung nach nicht die beste Wahl.
Oleg
3
Getestet und es funktioniert gut, danke. @Oleg, könntest du eine Antwort ausarbeiten, die zeigt, welche Konfiguration du brauchst? Es kann gut sein, dies in einer Konfigurationsdatei zu haben.
Drew Noakes
4
@Oleg vielleicht, aber die Verwendung UseUrlsist der vom ASP.NET-Team empfohlene Ansatz für Self-Hosting-Szenarien (der Wert selbst muss natürlich nicht fest codiert sein). Trotzdem habe ich meine Antwort aktualisiert, um zu erwähnen, wie Sie dies mit dem Konfigurations-Builder tun können.
Kévin Chalet
1
@Pinpoint: Ich habe die alte Antwort gepostet , in der man findet, wie man den Port mit ändert hosting.json. Das einzige, was man tun muss, ist das Lesen der Informationen in RC2 zu erzwingen (siehe Ankündigung ).
Oleg
2
Sie benötigen das folgende Paket:using Microsoft.Extensions.Configuration.CommandLine;
Lerner
85

Sie können den Kestrel-Abschnitt in die Datei asp.net core 2.1+ appsettings.json einfügen.

  "Kestrel": {
    "EndPoints": {
      "Http": {
        "Url": "http://0.0.0.0:5002"
      }
    }
  },
Menxin
quelle
3
Danke, genau das, was ich brauchte :-) Besser als UseUrls (). Weitere Details: docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/…
KTCO
7
Dies funktioniert tatsächlich mit Binärdateien, die durch generiert werden dotnet publish.
Rsenna
Definiert dies nicht den Port, an dem Kestrel an IIS (Proxy) gebunden ist, und nicht den Port, an dem die App in IIS gehostet wird?
user12345
@ user12345 Beim IIS-Hosting verwendet Kestrel die dynamische Portbindung.
Menxin
1
funktioniert auch mit netcore 3.0 mit web api von exe, brillant !!!
Vidriduch
57

Follow-up-Antwort, um allen bei der VS-Docker-Integration zu helfen. Ich musste auf Port 8080 wechseln, um die "flexible" Umgebung in Google Appengine verwenden zu können.

In Ihrer Docker-Datei benötigen Sie Folgendes:

ENV ASPNETCORE_URLS=http://+:8080
EXPOSE 8080

und Sie müssen auch den Port in docker-compose.yml ändern:

    ports:
      - "8080"
Casey
quelle
3
Vielen Dank, wir können Variablen in Windows-Befehl Promt auf die gleiche Weise setzen: set ASPNETCORE_URLS = http: // *: 8080
Pavel Biryukov
1
Das funktioniert bei mir nicht. Sind Sie sicher, dass dies alles ist, was Sie geändert haben? Mussten Sie etwas Besonderes an Ihren Bildnachwörtern oder etwas mit Docker tun?
Steve
Es ist so lange her, dass es sich vielleicht geändert hat, aber wenn ich mich erinnere, war das alles, was ich tun musste.
Casey
In VS Code können Sie "ASPNETCORE_URLS": "http: // +: 8080" im Abschnitt "env" von launch.json hinzufügen, um andere Einstellungen zu überschreiben.
Gorlok
31

Eine alternative Lösung besteht darin, a hosting.jsonim Stammverzeichnis des Projekts zu verwenden.

{
  "urls": "http://localhost:60000"
}

Und dann rein Program.cs

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

    var host = new WebHostBuilder()
        .UseKestrel(options => options.AddServerHeader = false)
        .UseConfiguration(config)
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseStartup<Startup>()
        .Build();

    host.Run();
}
Dennis
quelle
7
Das hat bei mir nicht funktioniert. server.urls ist jetzt eine URL und stellt sicher, dass Sie einen Eintrag zu project.json hinzufügen. "PublishOptions": {"include": ["appsettings.json", "web.config", "wwwroot", "hosts.json"]},
Manish Jain
3
Ich habe seine Antwort mit der richtigen Eigenschaft aktualisiert urls- danke @ManishJain
TetraDev
30

Sie können die Hosting-URL angeben, ohne Änderungen an Ihrer App vorzunehmen.

Erstellen Sie eine Properties/launchSettings.jsonDatei in Ihrem Projektverzeichnis und füllen Sie sie wie folgt:

{
  "profiles": {
    "MyApp1-Dev": {
        "commandName": "Project",
        "environmentVariables": {
            "ASPNETCORE_ENVIRONMENT": "Development"
        },
        "applicationUrl": "http://localhost:5001/"
    }
  }
}

dotnet runDer Befehl sollte Ihre launchSettings.jsonDatei auswählen und in der Konsole anzeigen:

C:\ProjectPath [master ≡]
λ  dotnet run
Using launch settings from C:\ProjectPath\Properties\launchSettings.json...
Hosting environment: Development
Content root path: C:\ProjectPath
Now listening on: http://localhost:5001
Application started. Press Ctrl+C to shut down. 

Weitere Details: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments

Zufällig
quelle
1
Arbeiten Sie auch in der appSettings.json?
Paulo
Nein, es muss drin sein [ProjectRoot]/Properties/launchSettings.json, aber das Schöne ist, es funktioniert reibungslos.
Chaim Eliyah
5
Dies ist nur während der Entwicklung nützlich, funktioniert nicht mit Binärdateien. Zur Verwendung dotnet runbenötigen Sie Zugriff auf den Quellcode.
Rsenna
18

Bei Verwendung dotnet run

dotnet run --urls="http://localhost:5001"
jabu.hlong
quelle
Die perfekte Antwort! Funktioniert im Docker. Ersetzte nur "localhost" durch "0.0.0.0"
AndrewPt
17

Über .net Core 2.2 die Methode Main Support Args mit WebHost.CreateDefaultBuilder (Args)

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

Sie können Ihr Projekt erstellen und den binBefehl wie folgt ausführen

dotnet <yours>.dll --urls=http://localhost:5001

oder mit Multi-URLs

dotnet <yours>.dll --urls="http://localhost:5001,https://localhost:5002"
oudi
quelle
Sie können einfach 'dotnet run --urls = 0.0.0.0:5001 ' im Projektverzeichnis verwenden
oudi
12

Beim Hosting in Docker-Containern (Linux-Version für mich) wird möglicherweise die Meldung "Verbindung abgelehnt" angezeigt. In diesem Fall können Sie die IP-Adresse 0.0.0.0 verwenden, was "alle IP-Adressen auf diesem Computer" anstelle des localhost- Loopbacks bedeutet, um die Portweiterleitung zu korrigieren.

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

        host.Run();
    }
}
R. van Diesen
quelle
5

Alternativ können Sie den Port angeben, indem Sie die App über die Befehlszeile ausführen.

Führen Sie einfach den Befehl aus:

dotnet run --server.urls http://localhost:5001

Hinweis: Wobei 5001 der Port ist, auf dem Sie ausgeführt werden möchten.

Mwiza
quelle
5

Folgen Sie auf .Net Core 3.1 einfach Microsoft Doc, dass es ziemlich einfach ist: kestrel-aspnetcore-3.1

Zusammenfassen:

  1. Fügen Sie CreateDefaultBuilder den folgenden Abschnitt ConfigureServices hinzu Program.cs:

    // using Microsoft.Extensions.DependencyInjection;
    
    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureServices((context, services) =>
            {
                services.Configure<KestrelServerOptions>(
                    context.Configuration.GetSection("Kestrel"));
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
  2. Fügen Sie der appsettings.jsonDatei die folgende Grundkonfiguration hinzu (weitere Konfigurationsoptionen im Microsoft-Artikel):

    "Kestrel": {
        "EndPoints": {
            "Http": {
                "Url": "http://0.0.0.0:5002"
            }
        }
    }
  3. Öffnen Sie CMD oder Console in Ihrem Projekt. Binärordner veröffentlichen / debuggen / freigeben und führen Sie Folgendes aus:

    dotnet YourProject.dll
  4. Viel Spaß beim Erkunden Ihrer Website / API unter Ihrem http: // localhost: 5002

Ernest
quelle
3

Gehen Sie zu properties / launchSettings.json und suchen Sie Ihren App-Namen. Suchen Sie darunter applicationUrl. Sie werden sehen, es läuft localhost: 5000, ändern Sie es nach Belieben. und dann dotnet run ...... hurra laufen lassen

Md. Rafee
quelle
0

Ich habe das Portproblem in Net Core 3.1 mithilfe der folgenden Schritte behoben

In der Program.cs

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args)
        .ConfigureWebHost(x => x.UseUrls("https://localhost:4000", "http://localhost:4001"))
        .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
}

Sie können mit auf die Anwendung zugreifen

http://localhost:4000

https://localhost:4001
Sukesh Chand
quelle