如何解决部署在Heroku上的ASP.NET Core API项目出现的H10错误?
问题根因
该错误是ASP.NET Core应用未适配Heroku的动态端口分配规则导致的启动失败。Heroku不会为应用分配固定端口,容器启动时会通过PORT环境变量注入动态分配的可用端口,应用必须主动监听该端口才能正常启动。
解决方法
1. 修改应用端口监听逻辑
根据你使用的.NET版本修改对应代码:
- .NET 6+ 极简API模式,修改
Program.cs:var builder = WebApplication.CreateBuilder(args); // 新增以下配置,优先读取Heroku注入的PORT变量,本地开发时默认使用5000端口 string port = Environment.GetEnvironmentVariable("PORT") ?? "5000"; builder.WebHost.UseUrls($"http://*:{port}"); // 原有服务注册、中间件配置逻辑无需修改 - .NET 5及更早版本,修改
Program.cs的CreateHostBuilder方法:public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); // 新增端口配置 string port = Environment.GetEnvironmentVariable("PORT") ?? "5000"; webBuilder.UseUrls($"http://*:{port}"); });
2. 修正Dockerfile配置
不要在Dockerfile中强制指定固定启动端口,也不需要额外声明EXPOSE指令(Heroku会主动忽略该配置),启动命令保持最简即可:
# 其他镜像构建逻辑保持不变 ENTRYPOINT ["dotnet", "替换为你的项目输出dll名称.dll"]
3. 额外排查项
如果修改后仍有问题,检查以下配置:
- 关闭HTTPS重定向中间件,Heroku会自行处理SSL终止,应用仅需监听HTTP即可,强制HTTPS跳转会导致请求异常
- 确认本地构建的镜像可以正常运行,不存在依赖缺失、配置文件丢失等基础问题
- 确认Heroku应用的运行时堆栈与你的项目.NET版本兼容
内容的提问来源于stack exchange,提问作者AspCoreStudent
相关产品推荐
相关产品推荐

