You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

容器内ASP.NET Core(Kestrel)运行正常,外部访问报连接重置错误

问题分析与解决方案

核心原因

你的Kestrel服务仅监听了容器内部的localhost(127.0.0.1)地址,未绑定到容器的所有网卡(0.0.0.0)。这就导致:

  • 容器内部访问localhost:5000时,请求能命中Kestrel服务,所以正常返回
  • 宿主机通过端口映射访问时,请求会发到容器的外部IP,但Kestrel没监听这个地址,直接重置连接,自然也不会生成日志记录

解决方案

方法1:通过环境变量配置Kestrel监听地址

在创建容器的命令中添加ASPNETCORE_URLS环境变量,指定Kestrel监听所有网卡的5000端口:

podman container create --name dotnet_st --volume html:/www --publish 15010:5000 --entrypoint '["/usr/bin/dotnet","ST.CMS.WebApp.dll"]' --env ASPNETCORE_ENVIRONMENT=LinuxTest --env ASPNETCORE_URLS=http://0.0.0.0:5000 --workdir /www/st dotnet

方法2:在代码中强制配置监听地址

如果不想依赖环境变量,可以在项目的Program.cs中显式设置Kestrel的监听地址:

var builder = WebApplication.CreateBuilder(args);
// 其他业务配置...

// 添加以下代码,指定监听所有网卡的5000端口
builder.WebHost.UseUrls("http://0.0.0.0:5000");

var app = builder.Build();
// 中间件配置...
app.Run();

验证步骤

  1. 删除原有容器:podman rm -f dotnet_st
  2. 用修改后的命令重新创建容器
  3. 宿主机执行curl localhost:15010,此时应该能正常返回页面HTML

内容的提问来源于stack exchange,提问作者Paul

火山引擎 最新活动