You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 21:51:30