3

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

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 个项目?

4

1 回答 1

2

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

将 Kestrel 绑定到类似的 DNS 名称dev.website.com对 Kestrel 侦听请求的方式没有任何影响。它仍然需要占用一个端口(默认为 80)。如果您尝试让 Kestrel 的两个实例绑定到 80,那么首先启动的那个实际上会获得端口,而另一个会出错。

将名称添加到主机文件无关紧要;所做的只是两者兼而有之devapi.website.com,并dev.website.com下定决心127.0.0.1。您只有一个端口 80 可以绑定。在您的机器上运行两个 HTTP 服务器的唯一方法是将它们绑定到不同的端口。

您可以通过稍微不同的方式实现相同的功能:

  1. 将您的 Kestrel 实例绑定到单独的端口 - 80/81、 或50080/50080等。
  2. 使用ngroklocaltunnel之类的隧道工具来创建终止于这些端口的单独隧道。

例如,使用 localtunnel,

lt --port 50080
lt --port 50081

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

于 2017-01-18T21:15:12.667 回答