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

Swagger UI中HTTPS不显示,.NET容器API请求仅走HTTP问题

解决方案:Swagger API请求HTTP问题及.NET HTTPS配置报错处理

一、修复Swagger API请求的HTTP协议问题

核心原因是后端.NET应用不知道外部通过HTTPS访问,Swagger默认用后端的HTTP协议生成请求URL。优先用以下两种无需修改Dockerfile的方案:

1. 启用Forwarded Headers中间件

在Program.cs中添加转发头处理,让应用识别Ingress传递的外部协议:

// 放在app.UseRouting()之前
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});

配置后,应用会读取Ingress发送的X-Forwarded-Proto头,自动让Swagger生成HTTPS的API请求URL。

2. 显式指定Swagger Server地址

如果转发头配置无效,直接在Swagger生成配置中硬编码外部HTTPS地址:

builder.Services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "你的API名称", Version = "v1" });
    // 添加HTTPS服务器配置
    c.AddServer(new OpenApiServer
    {
        Url = "https://example.org",
        Description = "生产环境HTTPS服务"
    });
});

这会强制Swagger UI所有API请求使用指定的HTTPS地址。

二、解决Dockerfile配置HTTPS时的报错

如果必须让后端应用本身运行在HTTPS上,需确保证书和Kestrel配置正确:

1. 正确复制并配置证书

Dockerfile中复制自签名PFX证书到容器:

# 复制证书文件到容器内指定目录
COPY ./cert/your-cert.pfx /app/cert/your-cert.pfx

然后通过appsettings.json配置Kestrel:

"Kestrel": {
    "Endpoints": {
        "Http": { "Url": "http://+:8080" },
        "Https": {
            "Url": "https://+:8081",
            "Certificate": {
                "Path": "/app/cert/your-cert.pfx",
                "Password": "你的证书密码"
            }
        }
    }
}

或者在启动命令中直接指定参数:

ENTRYPOINT ["dotnet", "YourApp.dll", "--urls", "http://+:8080;https://+:8081", "--Kestrel:Certificates:Default:Path=/app/cert/your-cert.pfx", "--Kestrel:Certificates:Default:Password=你的证书密码"]

2. 处理自签名证书信任问题

如果是测试环境,可在Kestrel配置中禁用证书验证(仅测试用,生产环境不要这么做):

builder.WebHost.ConfigureKestrel(options =>
{
    options.ListenAnyIP(8081, opts =>
    {
        opts.UseHttps("/app/cert/your-cert.pfx", "你的证书密码", config =>
        {
            config.AllowAnyServerCertificate();
        });
    });
});

注意:证书必须是包含私钥的PFX格式,若为CER格式需转换为PFX并绑定私钥。

三、Ingress层面的补充配置

针对Nginx Ingress,添加注解确保转发头正确传递:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: your-api-ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/use-forwarded-headers: "true"
    nginx.ingress.kubernetes.io/x-forwarded-proto: "https"
spec:
  tls:
  - hosts:
    - example.org
    secretName: your-tls-secret
  rules:
  - host: example.org
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: your-api-service
            port:
              number: 8080

这些注解确保Ingress将外部的HTTPS协议信息通过X-Forwarded-Proto头传递给后端应用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:20:34