使用子域名时出现EADDRINUSE错误

3
假设你有两个ASP.NET Core项目;一个是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();
在我的hosts文件中:
127.0.0.1 devapi.website.com
127.0.0.1 dev.website.com
如果我在Program.cs中指定相同的端口号(或者干脆不指定 - 我想使用端口80),一个项目将会运行,而另一个项目则会在启动时抛出

Microsoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException:Error -4091 EADDRINUSE地址已被使用

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

1
Nate是正确的,这不起作用。使用Kestrel时,您应该使用更多或更少随机的端口号,因为Kestrel不是直接面向互联网的。 Kestrel必须始终在反向代理后面使用。反向代理可以在同一端口上使用不同的主机名并将流量重定向到内部(即devapi.example.com到localhost:5000和dev.example.com到localhost:5001)。 - Tseng
你可以使用WebListener,它允许你共享端口(在同一或不同的主机上),但WebListener仅适用于Windows。反向代理是.net core/portable场景的正确方案,除非你需要Ntlm/windows身份验证,这只适用于WebListener。 - Tseng
1个回答

2
你想要做的事情是不可能的,至少没有解决办法是必须的。以下是原因: 将Kestrel绑定到像dev.website.com这样的DNS名称并不影响Kestrel监听请求的方式。它仍然必须占用一个端口(默认为80)。如果你尝试让两个Kestrel实例绑定到80,无论哪一个先启动,都会获取该端口,并且另一个将出现错误。 将名称添加到您的hosts文件中并没有任何作用;它只是使devapi.website.comdev.website.com都解析为127.0.0.1。你只有一个端口80可供绑定。在计算机上运行两个HTTP服务器的唯一方法是将它们绑定到不同的端口。 你可以通过稍微不同的方式实现相同的功能:
  1. 将Kestrel实例绑定到不同的端口- 80/8150080/50080等。
  2. 使用隧道工具,如ngroklocaltunnel,创建单独的隧道,终止于那些端口。
例如,使用localtunnel,
lt --port 50080
lt --port 50081
你将会得到两个URL链接,分别是https://gqgh.localtunnel.mehttps://fydh.localtunnel.me,它们指向你的不同Kestrel服务器。它们不在你的域名下(这可能会有些问题,具体情况取决于你的情况),但至少它们是不同的公共URL链接。

谢谢,Nate。我会试一试localtunnel,或者尝试其他策略。 - Benjamin
1
@Nate,IIS与您可以使用不同的主机名和相同的端口创建两个站点有什么区别? - thomasvdb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,