Подтвердить что ты не робот

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

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

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

P.S. Этот question не является дубликатом этого... это относится к asp.net pre RC1, когда у хостинга .ini на самом деле был формат .ini. Теперь, JSON и я не можем найти документацию о том, что на самом деле должно быть в ней.

P.P.S. Реальное решение находится в непринятом ответе на связанный вопрос с огромным предостережением. Шаги:

  • Измените ваш project.json на связанный ответ.
  • Опубликуйте проект на своем сервере.
  • На сервере перейдите в папку... \approot\src\YourProject и откройте там окно команд.
  • Запустить dnx web - он не сработает
  • Запустить dnu restore
  • Запустить 'dnu build`
  • Запустите 'dnx web` - веб-сервер должен начать нормально
4b9b3361

Ответ 1

Конфигурационный файл по умолчанию, используемый сервером 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 для регистрации любого IT-адреса.

ОБНОВЛЕНО 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.

Ответ 2

В RC2 раздел команд project.json больше не используется. Я еще не получил Kestrel, чтобы забрать хостинг .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

Если вы пытаетесь поместить приложение 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