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

.NET 9 API在Docker中运行时OpenAPI地址异常致UI请求失败

问题解决:Docker中.NET 9 API OpenAPI服务器地址异常

问题原因

Docker容器内的Kestrel默认绑定[::]:8080(IPv6任意地址),OpenAPI文档生成时会直接使用这个监听地址。外部客户端(如Swagger UI/Scalar)运行在宿主机,无法通过容器内部的[::]:8080访问API,导致请求失败;而宿主机的localhost:8080能正常访问,是因为Docker完成了端口映射。

解决方案

方法1:配置ForwardedHeaders识别外部真实地址

在Program.cs中添加ForwardedHeaders配置,让应用正确识别外部请求的地址:

var builder = WebApplication.CreateBuilder(args);

// 配置ForwardedHeaders
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
    options.ForwardedHeaders = Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedFor | Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedProto;
    // 允许Docker网关地址作为代理
    options.KnownProxies.Add(IPAddress.Parse("172.17.0.1"));
});

// 其他服务注册...

var app = builder.Build();

// 启用ForwardedHeaders中间件(需放在其他中间件之前)
app.UseForwardedHeaders();

// 其他中间件配置(如Swagger、路由等)...

启动容器时添加环境变量:

docker run -p 8080:8080 -e ASPNETCORE_FORWARDEDHEADERS_ENABLED=true your-image-name

方法2:手动指定OpenAPI服务器地址

在Swagger配置中直接添加外部可访问的服务器地址,覆盖自动生成的容器内部地址:

builder.Services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "你的API名称", Version = "v1" });
    // 手动添加宿主机可访问的服务器地址
    c.AddServer(new OpenApiServer { Url = "http://localhost:8080" });
});

方法3:修改Kestrel绑定地址

在Dockerfile的final阶段添加环境变量,指定Kestrel绑定IPv4任意地址:

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENV ASPNETCORE_URLS=http://0.0.0.0:8080
ENTRYPOINT ["dotnet", "Scientometrics.Api.v3.dll"]

验证

重新构建镜像并启动容器,访问openapi/v1.json查看servers字段,确认地址已变为http://localhost:8080,此时Swagger UI/Scalar即可正常发起API请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 04:17:17