使用子域时EADDRINUSE

时间:2017-01-18 21:01:42

标签: c# .net iis asp.net-core kestrel

假设您有2个ASP.NET核心项目; API和网站。 我想使用以下网址(devapi.website.comdev.website.com在本地(同时,因为网站使用api)处理这些内容。

目前,我只能在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

如果我在Program.cs中指定相同的端口号(或者,事实上,根本没有 - 我想使用端口80),一个项目将运行而另一个项目将抛出

  

Microsoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException:错误-4091 EADDRINUSE地址已在使用

启动时。

如何在不指定不同端口号的情况下同时运行这两个项目?

1 个答案:

答案 0 :(得分:2)

您尝试做的事情是不可能的,至少没有解决方法。原因如下:

将Kestrel绑定到像dev.website.com这样的DNS名称对Kestrel监听请求的方式没有任何影响。它仍然必须绑定一个端口(默认为80)。如果您尝试将两个Kestrel绑定实例绑定到80,则先启动哪个实际获取端口,另一个实际生成错误。

将名称添加到主机文件无关紧要;所有这一切都使devapi.website.comdev.website.com解析为127.0.0.1。您只有一个端口80要绑定。在您的计算机上运行两个HTTP服务器的唯一方法是将它们绑定到不同的端口。

您可以采用略微不同的方式实现相同的功能:

  1. 将您的Kestrel实例绑定到单独的端口 - 80/8150080/50080等。
  2. 使用ngroklocaltunnel等隧道工具创建在这些端口终止的单独隧道。
  3. 例如,使用localtunnel,

    lt --port 50080
    lt --port 50081
    

    您将获得两个网址,例如https://gqgh.localtunnel.mehttps://fydh.localtunnel.me,它们将指向您单独的Kestrel服务器。它们不在您的域中(根据您的具体情况,可能不是首发),但至少它们是单独的公共网址。