Docker容器HTTP请求异常:宿主机请求出现socket hang up问题
问题原因与解决方案
问题根源
你的ASP.NET Core应用在容器内仅监听localhost:5000,这意味着应用只会响应容器内部回环地址的请求,不会监听容器的外部网络接口。Docker的端口映射是将宿主机端口转发到容器的外部可访问接口,因此宿主机的请求无法被容器内的应用接收,导致出现Error: socket hang up错误。而容器内部访问localhost:5000能正常工作,是因为直接命中了应用绑定的回环地址。
解决方法
你需要让应用监听容器的所有网络接口(0.0.0.0),有以下几种实现方式:
- 代码层面修改:
在Program.cs中配置监听地址:
.NET 5及更早版本:
.NET 6+版本:public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseUrls("http://0.0.0.0:5000"); webBuilder.UseStartup<Startup>(); });var builder = WebApplication.CreateBuilder(args); builder.WebHost.UseUrls("http://0.0.0.0:5000"); // 其他配置代码... var app = builder.Build(); - 环境变量配置:
启动容器时添加环境变量参数:docker run -d -p 6000:5000 -e ASPNETCORE_URLS="http://0.0.0.0:5000" webapi - 配置文件修改:
在appsettings.json中添加配置项:{ "ASPNETCORE_URLS": "http://0.0.0.0:5000" }
验证
修改完成后,重新构建镜像或重启容器,在宿主机通过Postman访问http://localhost:6000/api/Users即可正常获取用户列表。
内容的提问来源于stack exchange,提问作者Valerons
相关产品推荐
相关产品推荐

