Linux下运行ASP.NET Core示例项目URL出现[::]是什么原因?
问题根因
这个问题是两个特性共同作用的结果:
ASP.NET Core绑定主机名时的监听输出逻辑
当你在applicationUrl中填写主机名(而非直接写IP)时,ASP.NET Core的Kestrel服务器会解析该主机名对应的所有可用IP地址,同时监听所有解析到的IPv4、IPv6地址。在.NET 5及更早版本中,此时Kestrel输出的启动日志里的监听地址会统一展示为Now listening on: http://[::]:5000,而非你配置的主机名地址,用来表示Kestrel正在监听所有可用的IPv6和兼容的IPv4接口。VS Code C#扩展的serverReadyAction正则匹配逻辑
你配置的serverReadyAction中的正则\bNow listening on:\s+(https?://\S+)会直接提取日志里输出的http://[::]:5000作为%s的替换值,因此最终拼接出来的跳转地址就是http://[::]:5000/WeatherForecast,而非你预期的主机名地址。
附带问题说明
你之前遇到的Failed to determine the https port for redirect.报错,是因为你移除HTTPS配置后,项目模板默认启用的HttpsRedirectionMiddleware无法找到对应的HTTPS端口,只需要在Startup.cs或者Program.cs里注释掉app.UseHttpsRedirection();这行即可解决,不需要修改监听地址。
解决方案
你可以选择以下任意一种方式解决跳转异常问题:
- 直接在
applicationUrl里填写IP地址而非主机名,符合你目前测试的正常场景 - 修改
serverReadyAction的uriFormat,写死要打开的地址前缀,比如"uriFormat": "http://Linux-2020:5000/WeatherForecast",忽略日志里提取的地址 - 升级到.NET 6及以上版本,.NET 6之后优化了Kestrel的启动日志输出,绑定单个主机名时会输出对应主机名的地址,而非
[::]通配符地址
内容的提问来源于stack exchange,提问作者Jeff Dege

