Как заставить веб-сервер пустельги прослушивать запросы, отличные от localhost?

84

Я развернул свое приложение C #, asp.net 5, mvc 6 на сервере Windows 2008. Я загорелся, dnx webон прослушивает порт 5000 и отлично работает при доступе с локального компьютера.

Как мне заставить его слушать запросы, отличные от localhost?

PS Этот вопрос не является дубликатом этого ... он относится к asp.net pre 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. Очень полезно!
Jonas

Ответы:

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.jsonесли оно существует.

Таким же образом можно перезаписать настройки 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: Error -4091 EADDRINUSE address already in use». В некоторых сценариях регистрация как IPv4, так и IPv6 хороша, в других случаях - нет. В любом случае хорошо упомянуть путь.
Олег
Отличное обновление для RC2, спасибо за подробное объяснение
Trygve
не .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, и, наконец, я могу добраться до конечных точек .NET Core, размещенных в Docker, с моего Mac. Сладкий!
Марк Лартер
Для получения информации об использовании hosting.json в RC2 и более подробных объяснений, прочтите ответ Олега выше, особенно «Обновлено 2»
Trygve
2
Также применимо к 1.0.0-preview2-003121, образ докера
linquize 01
18

Если вы используете asp.net core 2.1 +, измените раздел конфигурации в appsettings.json.

"Kestrel": {
  "EndPoints": {
    "Http": {
      "Url": "http://0.0.0.0:5002"
    }
  }
},
Menxin
источник
Этот также неизменно работал у меня при запуске из VS Code или Visual Studio для Mac. ASPNETCORE_URLSу меня не получилось
JSancho
10

Если вы пытаетесь поместить приложение ASP.NET Core в контейнер докеров (что было моим вариантом использования для прослушивания адресов, отличных от localhost), обратите внимание, что этот вариант использования уже был разработан для вас 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
GrandOpener
источник
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 вы добавляете переменную среды на вкладке «Отладка» свойств проекта.

Эдвард Брей
источник