Як змусити веб-сервер kestrel прослуховувати запити, що не стосуються локального хосту?


84

Я розгорнув свою програму c #, asp.net 5, mvc 6 на сервері Windows 2008. Я запустив, dnx webі він слухає порт 5000 і чудово працює при доступі з локального комп'ютера.

Як отримати його для прослуховування запитів, що не стосуються локальних хостів?

PS Це питання не є дублікатом цього ... воно стосується asp.net до RC1, коли hosting.ini насправді мав формат .ini. Зараз це JSON, і я не можу знайти жодної документації про те, що насправді має бути в ньому.

PPS Реальне рішення полягає у неприйнятій відповіді на пов’язане питання з величезним застереженням. Кроки:

  1. Змініть свій project.json відповідно до зв’язаної відповіді.
  2. Опублікуйте свій проект на своєму сервері.
  3. На сервері перейдіть у папку ... \ approot \ src \ YourProject і відкрийте там командне вікно.
  4. Біжи dnx web- не вдасться
  5. Біжи dnu restore
  6. Запустіть "dnu build"
  7. Запустіть "dnx web" - веб-сервер тепер повинен працювати нормально

PS Для людей, які голосують за це питання. Це застаріло. Дуже застарілий!

Він застосовувався до ранніх версій .NET Core. Питання та відповіді, безумовно, не застосовуються до поточних версій фреймворку (наприклад, 2.x, 3.x)



Ну, друга відповідь у зв’язаному питанні стосується формату JSON. Це теж не корисно для вас?
chue x

@chuex Я спробував це, і спочатку він розбив веб-сервер при запуску. Не знаю, чому. Потім я це зробив dnu restore, а потім, dnu buildа потім dnx webправильно запустив веб-сервер. Я не знаю, чому це відбувається, але принаймні я можу змусити це працювати. Безумовно, є помилка, яку потрібно усунути перед остаточним випуском. Наразі це обхідний шлях.
AngryHacker

1
Я відредагував запитання, щоб відобразити рішення.
AngryHacker

2
Я читав великі літери про застарілість, але мені дуже потрібні були відповіді тут навіть для веб-API в .NET Core 3.1. Спочатку я намагався прив’язати до 0.0.0.0:5000, але IPv6, очевидно, трапляється тут, і тому це не спрацювало. Тим часом [::]: 5000 також не працював для зовнішнього доступу до IPv4. Я навіть не підозрював, що прив’язка до *: 5000 була навіть річчю, оскільки зараз ми виходимо із стандарту IPv4 / IPv6. Тож дуже корисно!
Йонас

Відповіді:


116

Файл конфігурації за замовчуванням, який використовується сервером Kestrel, - hosting.json. У різних бета-версіях назву було змінено кілька разів. Якщо ви використовуєте зараз project.jsonіз наступним "command"розділом

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

то під час запуску сервера з командного рядка за допомогою

dnx web

файл hosting.jsonбуде прочитано. Файл

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

налаштує сервер для прослуховування 5000 на кожну адресу IP4. Конфігурація

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

повідомить прослухати 5000 як на IP4, так і на IP6 адресу.

Можна вказати альтернативні файли конфігурації за ASPNET_ENVзмінною середовища використання або за допомогою --config myconfig1.json(або config=myconfig1.json). Наприклад, ви можете використовувати

SET ASPNET_ENV=Development

і створити hosting.Development.jsonфайл із певною конфігурацією. Крім того, ви можете використовувати project.jsonз

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

і запустити сервер за використанням

dnx webProd

Я повинен додатково нагадати, що може знадобитися, щоб ви дозволили додатково слухати та реєструватися (для початку dnx web). Це потрібно через брандмауер та локальну безпеку прослуховування нових портів TCP / HTTP. Щось, як показано нижче, повинно зробити локальну реєстрацію та прослуховування порту 5000 для всіх (IPv4 та 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

Щоб бути більш безпечним, ви можете налаштувати наведену вище конфігурацію, щоб надати мінімальні права.

ОНОВЛЕНО: Дякую @BlaneBunderson. Можна використовувати * замість IP-адреси (наприклад http://*:5000) для прослуховування будь -яких адрес IP4 та IP6 з будь-якого інтерфейсу. Слід бути обережним і не використовувати їх

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

оскільки для цього потрібно буде двічі зареєструвати адресу IP6 ::або адресу IP4 .0.0.0.0

Відповідає оголошенню

Технічно, будь-яке ім'я хосту, яке не є "localhost" або недійсною адресою IPv4 або IPv6, призведе до прив'язки Kestrel до всіх мережевих інтерфейсів.

Я думаю, що поведінку можна змінити в майбутньому. Таким чином , я б рекомендував використовувати тільки *:5000, 0.0.0.0:5000і ::5000форму для реєстрації будь-якого ІТ - адреси.

ОНОВЛЕНО 2: ASP.NET Core RC2 змінює (див . Оголошення ) поведінку завантаження за замовчуванням. Потрібно внести зміни до, Mainщоб завантажити налаштування з hosting.jsonпараметрів командного рядка. Нижче наведено приклад використання

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

Вище використовуйте код три прив'язок: "http://*:1000", "https://*:1234", "http://0.0.0.0:5000"за замовчуванням , замість використання порту за замовчуванням 5000 по замовчуванням (точніше використання http://localhost:5000). Виклик .UseConfiguration(config)здійснюється після .UseUrls . Таким чином, конфігурація, завантажена з hosting.jsonкомандного рядка, або замінює параметри за замовчуванням. Якщо видалити один .SetBasePath(Directory.GetCurrentDirectory())рядок, то hosting.jsonфайл буде завантажено з того самого каталогу, де буде скомпільована dll програми (наприклад bin\Debug\netcoreapp1.0).

Можна використовувати виконання типу

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

перезаписати параметри за замовчуванням (від UseUrls) та параметри від "server.urls"властивості hosting.jsonif, якщо вона існує.

Таким же чином можна було б замінити налаштування ULR, встановивши змінну середовища

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

тоді за замовчуванням запуск програми, що використовується, dotnet.exe runбуде використовуватись http://localhost:12541/для прив'язки.

Ви можете знайти тут приклад використання HTTPS зв'язування.

ЗАБЕЗПЕЧЕННЯ: Назва змінної середовища змінено з ASPNETCORE_SERVER.URLSна ASPNETCORE_URLSна пізніші версії ASP.NET (див. Тут документацію до ASP.NET Core 3.1).


1
Крім того, ви можете використовувати "server.urls": "http: // *: 5000" замість "server.urls": " 0.0.0.0:5000 " (Особисто я думаю, що * має трохи більше сенсу.)
Блейн Bunderson

@BlaneBunderson: Дякую за вашу пропозицію! Я повинен додати, що http://*:5000це те саме, що http://::5000;http://0.0.0.0:5000і ні http://0.0.0.0:5000. Це змушує прослуховувати як IPv4, так і IPv6. Ви можете перевірити це за допомогою http://*:5000;http://::5000або http://::5000;http://*:5000. Під час реєстрації другої адреси з’являється помилка "Microsoft.AspNet.Server.Kestrel.Networking.UvException: Помилка -4091 Адреса EADDRINUSE, яка вже використовується". У деяких сценаріях реєстрація як IPv4, так і IPv6 є хорошою, в інших сценаріях це погано. У будь-якому випадку добре згадувати про спосіб.
Олег

Відмінне оновлення для RC2, дякую за детальне пояснення
Тригве

не .UseStartup<Startup>()замінить .UseConfiguration(config)у вашому прикладі "оновлення 2"?
nicks

у цій змінній середовища є помилка, це має бути ASPNETCORE_URLS
nrjohnstone

33

У RC2 розділ команд project.json більше не використовується. Я ще не отримав Kestrel, щоб забрати hosting.json, але ви можете програмно встановити порт в Main програми, де створюється та налаштовується новий WebHostBuilder. Просто додайте метод .UseUrls (), як у прикладі нижче

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

3
Це було великою допомогою. .UseUrls("http://*:5000")Натомість я використав і порт переадресував 5000 із порожнім IP-адресою хосту на VirtualBox, і нарешті я можу дістатися до розміщених у Docker кінцевих точок .NET Core із свого Mac. Солодко!
Марк Лартер

Для отримання інформації про використання hosting.json у RC2 та більш детального пояснення прочитайте відповідь Олега вище, особливо "Оновлено 2"
Тригве

2
Також застосовується до 1.0.0-preview2-003121, зображення
докера

18

Якщо ви використовуєте asp.net core 2.1+, змініть розділ конфігурації в appsettings.json.

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

Це також постійно працювало для мене під час запуску з VS Code або Visual Studio для Mac. ASPNETCORE_URLSне спрацював для мене
JSancho

10

Якщо ви намагаєтесь помістити програму ASP.NET Core всередину контейнера докера (що було моїм випадком використання для прослуховування нелокальних адрес хоста), зверніть увагу, що цей випадок використання вже склав для вас Microsoft. Ви можете побачити всю славу на https://hub.docker.com/r/microsoft/aspnetcore/

На даний момент (v1.0.1) ключовою магією для вирішення цієї проблеми є те, що вихідний Dockerfile містить налаштування змінної середовища url, і програма не намагається це замінити. (Дійсно, контейнерна програма повинна якомога менше стверджувати про середовище, де вона буде працювати.)

ENV ASPNETCORE_URLS http://+:80

Зверніть увагу на знак плюсу, а не на зірочку. Я насправді рекомендую відвідати вищезазначене посилання на dockerhub, читаючи мою відповідь, поки посилання хороше. Версія 1.1 не за горами, і в майбутньому все може змінитися.

Під час запуску контейнера обов’язково виставляйте гостьовий порт 80 відповідно до налаштування змінної середовища. Наприклад:

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

1
це був і мій варіант використання, і посилання було надзвичайно корисним. Дякую.
Oxymoron

4

Для AspNetCore 3.1+ просто додайте наступний рядок у файл appsettings.json:

"Urls": "http://*:80"

1
Працює як шарм. Я не можу знайти, чому рішення з hosting.jsonне працюють.
Machado

0

Встановіть змінну середовища ASPNETCORE_URLSв http://0.0.0.0:5000/.

Якщо працює з Visual Studio, ви додаєте змінну середовища на вкладці Налагодження властивостей проекту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.