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

ASP.NET Core API Docker部署访问返回404 Not Found错误

问题原因

该404错误由两个配置问题共同导致:

  • .NET Core 3.1 版本的Kestrel默认仅监听localhost回环地址的请求,而容器内的回环地址与宿主机/外部网络是隔离的,外部请求到达容器映射端口时,Kestrel未在对外网卡上监听对应端口,无法正常响应。
  • 现有Dockerfile的EXPOSE指令全部写在编译构建阶段,最终生成的运行时镜像未声明服务端口,且未配置Kestrel的对外绑定规则,即使启动容器时做了端口映射,应用也无法接收外部流量。
    另外Dockerfile中多余的RUN dotnet build步骤无实际作用,dotnet publish会自动完成编译流程,该指令只会额外增加镜像构建层数。

修复步骤

1. 修正Dockerfile配置

将端口声明移到运行时镜像阶段,同时配置Kestrel监听所有网卡地址,修正后的完整Dockerfile如下:

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
WORKDIR /app

# 复制项目文件并还原依赖
COPY *.csproj ./
RUN dotnet restore

# 复制剩余代码并发布
COPY . ./
RUN dotnet publish -c Release -o out

# 构建运行时镜像
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
EXPOSE 80
EXPOSE 443
COPY --from=build-env /app/out .
# 启动时绑定所有网卡的80端口,避免仅监听localhost
ENTRYPOINT ["dotnet", "TodoApi.dll", "--urls", "http://0.0.0.0:80"]

如果不想把绑定规则写在启动命令里,也可以在运行时阶段添加环境变量实现相同效果,添加后可保留原ENTRYPOINT写法:

ENV ASPNETCORE_URLS=http://0.0.0.0:80

2. 重新构建并启动容器

执行以下命令禁用缓存重新构建镜像,避免旧版本镜像缓存导致配置不生效:

docker build --no-cache -t todoapi .

启动容器时将宿主机端口映射到容器80端口即可,无需映射多余端口:

docker run -d -p 8080:80 --name todoapi-test todoapi

启动后访问http://localhost:8080/api/todo即可正常获取接口响应。
如果需要验证容器内服务是否正常,可执行以下命令在容器内部发起请求,能正常返回JSON数据即说明应用运行正常:

docker exec -it todoapi-test curl http://localhost:80/api/todo

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 01:01:41