如何将 ASP.NET Core 内置的 Web 服务器 (Kestrel) 默认 IP 绑定从 127.0.0.1 更改为 0.0.0.0?

5
我在Ubuntu VPS上安装了.NET Core SDK v3.1,并且正在尝试使用ASP.NET Core项目。我使用dotnet new webapp -o --no-https来创建一个ASP.NET Core项目,并使用dotnet run运行它,使用.NET Core内置的Web服务器。 然而,我的问题是.NET Core内置的Web服务器绑定到IP地址127.0.0.1(本地主机),而不是VPS的公共IP地址。这意味着我只能从该VPS上的浏览器访问我的ASP.NET Core项目,而无法从远程计算机的浏览器访问。 如果Web服务器绑定到0.0.0.0而不是127.0.0.1,则会很好,因为0.0.0.0表示“所有网络接口”,而不仅仅是本地主机IP。人们建议前往项目文件夹,然后进入Properties文件夹,在那里编辑名为launchSettings.json的文件。在该文件中,我们需要将"applicationUrl": "http://localhost:5000"更改为"applicationUrl": "http://0.0.0.0:5000"。完成此操作并重新运行该项目后,问题得到解决,我可以从远程计算机连接到Web服务器。 然而,该解决方案需要编辑每个项目的launchSettings.json文件。我正在寻找不需要更改每个项目的解决方案,而更像是一次更改Web服务器设置的解决方案。是否存在这样的解决方案?例如,Web服务器的某些设置文件定义绑定到哪个IP地址和端口,或者如果没有这样的设置,则可能有一些ASP.NET Core项目模板,并且我可以进入该模板的文件夹,然后在那里编辑模板的launchSettings.json文件,因此自从那时起创建的所有新ASP.NET Core项目都将使用正确的IP(0.0.0.0)创建。任何只需要一次完成的解决方案都将是很好的。
1个回答

15

launchSettings.json文件只适用于开发目的。在此时,您通常只进行本地开发,并且不希望外部设备访问您的服务器。这就是为什么默认情况下使用回环接口是有意义的。

对于生产或一般非开发目的,您应该使用dotnet publish(或通过Visual Studio)正确打包应用程序。此时,发布的应用程序将不包括launchSettings.json,因此该配置实际上并不适用。

相反,您应该通过配置设置应用程序应侦听的URL。例如,使用环境变量ASPNETCORE_URLS

# E.g. on Linux:
ASPNETCORE_URLS=http://0.0.0.0:80 dotnet MyApp.dll

或者通过将URL传递到--url命令行参数来实现。

MyApp.exe --urls http://0.0.0.0:80

你也可以将它放入 appsettings.json 或特定于环境的 appsettings.ENV.json 中:

{
    // …
    "urls": "http://0.0.0.0:80"
}

由于appsettings通常被提交到源代码控制中,这使得您可以在不同机器之间保持配置。

至于同时更改多个项目的情况,唯一的选项是使用更新后的URL设置全局环境变量。但是,由于多个应用程序不能托管在相同的接口/端口组合上,因此这可能不是最好的想法,因为环境变量的值会覆盖appsettings中的值,使得理解更加复杂。


非常感谢你poke。即使我不使用“dotnet publish”,只使用“dotnet run”,你写的3个解决方案也会起作用吗? 因为我处于开发阶段,并且不想在每次迭代后都进行发布..只有一个约束,即必须在远程计算机上打开一个浏览器,因为具有Kestrel的计算机是一个VPS,带有Ubuntu,没有桌面环境(我通过SSH连接到它,所以那里没有浏览器..) - spaceman
1
是的,在开发模式下,所有这些都可以通过 dotnet run 很好地工作。例如:dotnet run --urls http://0.0.0.0:80 - poke
在Linux上,“var=value”命令语法只是一种为单个进程本地设置环境变量的方式。您可以使用“export ASPNETCORE_URLS=http://0.0.0.0:80”(或在您的shell配置文件中)绝对地为整个会话设置环境变量,并将其应用于您启动的所有进程。只是通常情况下,您只想将此变量显式地应用于单个进程;因此这是该语法的用途。哦,还有,“dotnet MyApp.dll”是在Linux上使用.NET Core运行时启动.NET应用程序的方法。 - poke
谢谢。我执行了 export ASPNETCORE_URLS=http://0.0.0.0:5000,然后运行了 dotnet run。它并没有像之前的 --urls 成功那样成功 - 它仍然绑定到 127.0.0.1。我通过执行 export 验证了 export 确实在内存中,并且它在列表中。有没有办法让 ASPNETCORE_URLS 解决方案也能够工作? - spaceman
如果您需要设置一个以上的URL,您可以添加以下行:"urls": "http://0.0.0.0:5000;https://0.0.0.0:5001" - scil
显示剩余2条评论

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