2017-01-18 7 views
3

Предположим, у вас есть 2 основных проекта ASP.NET; API и веб-сайт. Я хочу подойти к этим локально (и одновременно, поскольку сайт использует api), используя следующие URL: devapi.website.com и dev.website.com.EADDRINUSE при использовании поддоменов

В настоящее время, я могу только получить эту работу, когда я указать другой номер порта для обоих проектов в файле Program.cs (и с использованием указанного номера порта в браузере):

API

var host = new WebHostBuilder() 
    .UseUrls("http://devapi.website.com:81") 
    .UseKestrel() 
    .UseContentRoot(Directory.GetCurrentDirectory()) 
    .UseIISIntegration() 
    .UseStartup<Startup>() 
    .Build(); 

Сайт

var host = new WebHostBuilder() 
    .UseUrls("http://dev.website.com:82") 
    .UseKestrel() 
    .UseContentRoot(Directory.GetCurrentDirectory()) 
    .UseIISIntegration() 
    .UseStartup<Startup>() 
    .Build(); 

И в моих хозяев Файл:

127.0.0.1 devapi.website.com 
127.0.0.1 dev.website.com 

Если я указываю тот же номер порта (или, на самом деле, ни вообще - я не хочу использовать порт 80) в Program.cs, один проект будет работать, а другой бросит

Microsoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException: Ошибка -4091 EADDRINUSE адрес уже используется

при запуске.

Как я могу запустить эти 2 проекта одновременно без указания разных номеров портов?

+1

Нейт прав, это не работает. С Kestrel вы, как ожидается, будете использовать более или менее рандомизированные номера портов, потому что Kestrel не предназначен для прямой связи с Интернетом. Кестрел всегда должен использоваться за обратным прокси. Обратный прокси-сервер может использовать разные имена хостов на одном и том же порту и перенаправлять внутренний трафик (т. Е. Devapi.example.com на localhost: 5000 и dev.example.com на localhost: 5001). – Tseng

+0

Однако вы можете использовать WebListener, веб-прослушиватель позволяет вам обмениваться портами (на тех же или разных хостах), но веб-прослушиватель работает только в Windows. Обратный прокси - это правильный сценарий для сценариев ядра .net/portable, если вам не нужна аутентификация Ntlm/windows, это работает только на веб-прослушивателе – Tseng

ответ

2

То, что вы пытаетесь сделать, невозможно, по крайней мере, не обойтись без обходного пути. Вот почему:

Связывание Kestrel с DNS-именем, как dev.website.com, не имеет никакого отношения к тому, как Kestrel слушает запросы. Он по-прежнему должен привязать порт (по умолчанию 80). Если вы попытаетесь установить два экземпляра связки Kestrel на 80, в зависимости от того, какой из них запускается, на самом деле фактически получает порт, а другой будет ошибкой.

Добавление имен в файл hosts не имеет значения; все, что делает, составляет как devapi.website.com, так и dev.website.com. Разрешается использовать 127.0.0.1. У вас есть только один порт 80 для привязки. Единственный способ запустить два HTTP-сервера на вашем компьютере - связать их с отдельными портами.

Вы могли бы достичь той же функциональность несколько иначе:

  1. Bind экземпляров Kestrel для разделения портов - 80/81, или 50080/50080 и т.д.
  2. Используйте инструмент туннелирования как ngrok или localtunnel создать отдельные туннели, которые заканчиваются в этих портах.

Например, с localtunnel,

lt --port 50080 
lt --port 50081 

Вы получите два URL-адреса, как https://gqgh.localtunnel.me и https://fydh.localtunnel.me, которые будут указывать на ваши отдельные серверы Kestrel. Они не входят в ваш домен (который может быть не стартером, в зависимости от вашей ситуации), но, по крайней мере, это отдельные общедоступные URL-адреса.

+0

Спасибо Nate, что имеет смысл. Я дам localtunnel попробовать - или пойти с другой стратегией. –

+1

@Nate какая разница с IIS, где вы можете создать два сайта с другим именем хоста и одним и тем же портом? – thomasvdb

+0

@thomasvdb Хороший вопрос. Я не уверен. –

 Смежные вопросы

  • Нет связанных вопросов^_^