Как указать порт, на котором размещено приложение ASP.NET Core?


198

При использовании WebHostBuilderв Mainточке входа, как я могу указать порт, к которому он привязан?

По умолчанию он использует 5000.

Обратите внимание, что этот вопрос относится только к новому ASP.NET Core API (в настоящее время в 1.0.0-RC2).


10
изучить launchSettings.jsonиз Propertiesпапки. Вы можете изменить порт в launchUrl.
Олег

@ Олег, у меня остались некоторые настройки, связанные с IIS, из шаблона проекта RC1. Они не имели никакого эффекта.
Дрю Ноакс

Можно использовать hosting.json(см. Ответ ), которые были использованы по умолчанию в RC1, и нужно просто добавить .AddJsonFile("hosting.json", optional: true)(см. Здесь )
Олег

1
Использование стека конфигурации кажется действительно намного лучше, чем использование чисто VS-специфического механизма (launchSettings.json).
Кевин Шале

@DrewNoakes: я добавил свой старый ответ с ОБНОВЛЕНО 2 части. В нем описаны некоторые варианты изменения порта по умолчанию и использования hosting.jsonили командной строки для настройки привязки.
Олег

Ответы:


247

В ASP.NET Core 3.1 есть 4 основных способа указать пользовательский порт:

  • Используя аргументы командной строки, запустив приложение .NET с помощью --urls=[url]:
dotnet run --urls=http://localhost:5001/
  • Используя appsettings.json, добавив Urlsузел:
{
  "Urls": "http://localhost:5001"
}
  • Используя переменные среды, с ASPNETCORE_URLS=http://localhost:5001/.
  • Используя UseUrls(), если вы предпочитаете делать это программно:
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/");
            });
}

Или, если вы все еще используете компоновщик веб-хоста вместо универсального компоновщика хоста:

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

40
Использование фиксированных URL-адресов непосредственно в коде, на мой взгляд, не лучший выбор.
Олег

3
Проверено это, и это работает хорошо, спасибо. @ Олег, не могли бы вы конкретизировать ответ, показывающий, какой конфиг вам нужен? Было бы хорошо иметь это в конфигурационном файле.
Дрю Ноакс

4
@ Олег, возможно, но использование UseUrls- это подход, рекомендованный командой ASP.NET для сценариев с самостоятельным размещением (само значение не обязательно должно быть жестко задано). Тем не менее, я обновил свой ответ, чтобы упомянуть, как вы могли бы сделать это с помощью компоновщика конфигурации.
Кевин Шале

1
@Pinpoint: я разместил старый ответ , где можно найти, как изменить порт, используя hosting.json. Единственное, что нужно сделать, - это принудительно прочитать информацию в RC2 (см. Объявление ).
Олег

2
Вам понадобится следующий пакет:using Microsoft.Extensions.Configuration.CommandLine;
Ученик

89

Вы можете вставить раздел Kestrel в файл asp.net core 2.1+ appsettings.json.

  "Kestrel": {
    "EndPoints": {
      "Http": {
        "Url": "http://0.0.0.0:5002"
      }
    }
  },

3
Спасибо, именно то, что мне было нужно :-) Лучше, чем UseUrls (). Более подробная информация: docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/…
KTCO

7
Это на самом деле работает с двоичными файлами, сгенерированными через dotnet publish.
rsenna

Разве это не определяет порт, который Kestrel привязывает к IIS (прокси), а не порт, на котором размещено приложение в IIS?
user12345

@ user12345 На хостинге IIS Kestrel использует динамическое связывание портов.
menxin

1
также работает с Netcore 3.0 работает веб-API от EXE, бриллиант !!!
Видридуч

58

Ответьте на вопрос, чтобы помочь кому-либо сделать это с помощью интеграции с докером VS. Мне нужно было перейти на порт 8080, чтобы работать в «гибкой» среде в Google Appengine.

В вашем Dockerfile вам понадобится следующее:

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

и вам также нужно изменить порт в docker-compose.yml:

    ports:
      - "8080"

3
Спасибо, мы можем установить переменные в командной строке Windows таким же образом: set ASPNETCORE_URLS = http: // *: 8080
Павел Бирюков

1
это не работает для меня. Вы уверены, что это все, что вы изменили? Вам нужно было сделать что-то особенное с послесловием к вашему изображению или что-то еще с докером?
Стив

Прошло так много времени, что это могло измениться, но, если я вспомню, это было все, что мне нужно было сделать.
Кейси

в VS Code вы можете добавить «ASPNETCORE_URLS»: «http: // +: 8080» в раздел «env» файла launch.json, чтобы переопределить другие настройки.
Горлок

31

Альтернативное решение - использовать hosting.jsonв корне проекта.

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

А потом в 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();
}

7
Это не сработало для меня. server.urls теперь является URL-адресом и убедитесь, что вы добавили запись в project.json "publishOptions": {"include": ["appsettings.json", "web.config", "wwwroot", "hosting.json"]},
Маниш Джайн

3
Я обновил его ответ с правильным свойством urls- спасибо @ManishJain
TetraDev

30

Вы можете указать хостинг URL без каких-либо изменений в вашем приложении.

Создайте Properties/launchSettings.jsonфайл в каталоге вашего проекта и заполните его примерно так:

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

dotnet runКоманда должна выбрать ваш launchSettings.jsonфайл и отобразить его в консоли:

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. 

Более подробная информация: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments


1
Работать в appSettings.json тоже?
Пауло

Нет, это должно быть [ProjectRoot]/Properties/launchSettings.json, но прекрасная вещь, это работает без помех.
Хаим Элия

5
Это полезно только во время разработки, не работает с двоичными файлами. для использования dotnet runвам необходим доступ к исходному коду.
rsenna

18

При использовании dotnet run

dotnet run --urls="http://localhost:5001"

Идеальный ответ! Работает в докере. Заменено только "localhost" на "0.0.0.0"
AndrewPt

17

Выше .net core 2.2 метод Main support спорит с 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>();
}

Вы можете построить свой проект и binзапустить команду, как это

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

или с несколькими URL

dotnet <yours>.dll --urls="http://localhost:5001,https://localhost:5002"

Вы можете просто использовать 'dotnet run --urls = 0.0.0.0:5001 ' в каталоге проекта
oudi

12

При размещении в Docker-контейнерах (для меня версия Linux) вы можете получить сообщение «Соединение отказано». В этом случае вы можете использовать IP-адрес 0.0.0.0, что означает «все IP-адреса на этом компьютере» вместо loopback localhost, чтобы исправить переадресацию портов.

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

5

Кроме того, вы можете указать порт, запустив приложение через командную строку.

Просто запустите команду:

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

Примечание. Где 5001 - это порт, на котором вы хотите работать.


5

На .Net Core 3.1 просто следуйте Microsoft Doc, что это довольно просто: kestrel-aspnetcore-3.1

Подвести итоги:

  1. Добавьте следующий раздел ConfigureServices в CreateDefaultBuilder 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. Добавьте приведенную ниже базовую конфигурацию в appsettings.jsonфайл (дополнительные параметры конфигурации в статье Microsoft):

    "Kestrel": {
        "EndPoints": {
            "Http": {
                "Url": "http://0.0.0.0:5002"
            }
        }
    }
  3. Откройте CMD или Консоль в папке вашего проекта Publish / Debug / Release binaries и запустите:

    dotnet YourProject.dll
  4. Наслаждайтесь изучением вашего сайта / API на вашем http: // localhost: 5002


3

Перейдите в properties / launchSettings.json и найдите ваше имя приложения, а затем найдите applicationUrl. вы увидите, что он работает localhost: 5000, измените его на все, что вы хотите. а затем запустить дотнет запустить ...... ура


0

Я исправил проблему с портом в Net core 3.1 с помощью следующего

В программе .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>(); });
}

Вы можете получить доступ к приложению, используя

http://localhost:4000

https://localhost:4001
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.