ASP.NET 6 API部署到Heroku后所有路由均返回404状态码
故障原因
所有请求返回404来自两个核心配置问题:
- ASP.NET 6默认模板生成的代码中,Swagger组件注册、Swagger UI加载、根路径跳转到Swagger的逻辑,全部被限制在
IsDevelopment()判断分支内,只有运行环境标识为Development时才会加入请求处理管道。Heroku部署时默认给应用注入的ASPNETCORE_ENVIRONMENT值为Production,这部分逻辑完全不会执行,Swagger端点根本不存在,访问自然返回404,被环境判断包裹的业务接口同样会无法访问。 - 现有Dockerfile的启动配置存在缺陷:注释掉原生ENTRYPOINT后使用shell格式的CMD启动,虽然写了读取
$PORT的逻辑,但进程托管、信号转发都存在问题,部分场景下会出现应用启动但端口未正确绑定的情况。
修复步骤
1. 调整Swagger加载逻辑
打开项目中的Program.cs文件,将Swagger相关的服务注册、中间件配置移出开发环境判断分支,按需保留根路径跳转逻辑。修改后的核心代码示例:
// 全局注册Swagger生成器,移出开发环境判断 builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); // 全局启用Swagger中间件,所有环境均可加载文档 app.UseSwagger(); app.UseSwaggerUI(); // 配置根路径默认跳转到Swagger文档页 app.MapGet("/", () => Results.Redirect("/swagger/index.html")); // 其余原有中间件配置(授权、控制器映射等)保持不变 // app.UseHttpsRedirection(); // app.UseAuthorization(); // app.MapControllers(); app.Run();
如果是内部测试项目,也可以直接在Dockerfile中添加
ENV ASPNETCORE_ENVIRONMENT=Development,让应用在Heroku上以开发环境运行,不需要修改上述代码。但生产环境不建议这么做,会直接对外暴露接口文档。
2. 优化Dockerfile启动配置
修改Dockerfile的final阶段配置,修正启动命令,确保应用正确绑定Heroku动态分配的运行时端口:
FROM base AS final WORKDIR /app COPY --from=publish /app/publish . # 运行时动态解析Heroku分配的端口,启动应用 ENTRYPOINT sh -c "ASPNETCORE_URLS=http://*:$PORT dotnet Mongo_API.dll"
这个写法会在容器启动时通过shell解析Heroku注入的$PORT环境变量,让ASP.NET Core在正确的端口上监听所有网卡的请求,同时避免shell格式CMD带来的进程托管问题。
3. 重新部署验证
重新构建镜像推送到Heroku容器仓库,触发新的部署后,查看Heroku运行日志,确认出现Now listening on: http://0.0.0.0:[端口号]的启动成功日志,此时访问站点根路径、/swagger/index.html和业务接口就可以正常响应了。
可选优化
如果后续遇到HTTPS跳转循环的问题,可以注释掉app.UseHttpsRedirection()这行配置——Heroku平台对外已经统一提供HTTPS接入,内部回源到容器使用HTTP协议,强制HTTPS跳转中间件会触发不必要的重定向循环。
内容的提问来源于stack exchange,提问作者Robert Rachita
相关产品推荐
相关产品推荐

