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

ASP.NET部署反向代理后Swashbuckle Swagger HTTP转HTTPS配置问题

问题根因

这是反向代理场景下Swagger生成文档地址误判协议的典型问题:你的后端服务实际运行在HTTP协议下,Swashbuckle默认会根据当前请求的实际协议生成swagger.json的访问地址,导致在HTTPS的代理入口访问时生成了HTTP地址,触发浏览器混合内容拦截。你之前配置的c.Schemes({"https"})仅用来指定Swagger页面测试接口时使用的协议,和swagger文档本身的访问地址无关,所以不会解决当前问题。


解决方法

方案1:固定指定HTTPS根地址(简单稳定,支持运行时修改)

在EnableSwagger配置块中添加RootUrl委托,强制指定swagger文档的根地址为HTTPS协议的公网域名即可。如果需要运行时修改,直接把公网域名配置到配置文件中动态读取即可,无需修改代码。

修改后的SwaggerConfig.vb核心代码如下:

GlobalConfiguration.Configuration.EnableSwagger(
    Function(c)
        ' 强制指定Swagger文档的根路径为HTTPS公网地址
        c.RootUrl(Function(req) "https://external_public_name/api")
        ' 若要运行时可修改,改成从配置文件读取,示例:
        ' c.RootUrl(Function(req) ConfigurationManager.AppSettings("SwaggerRootUrl"))
        c.Schemes({"https"})
        c.SingleApiVersion("v1", "api")
        c.DocumentFilter(Of KnownSubTypesDocumentFilter)()
        Return c
    End Function).EnableSwaggerUi(
    Function(ui)
        ui.DocumentTitle("Skippy's API")
        ui.DocExpansion(DocExpansion.List)
        ui.SupportedSubmitMethods()
        Return ui
    End Function)

如果选择从配置读取的方式,只需要在web.config的<appSettings>节点添加一行配置即可,后续改地址直接修改配置项即可:

<add key="SwaggerRootUrl" value="https://external_public_name/api" />

方案2:通过反向代理转发头动态判断(更灵活,无需写死域名)

如果你的上游反向代理支持转发X-Forwarded-Proto(请求实际协议)和X-Forwarded-Host(请求实际域名)头,可以直接通过请求头动态生成根地址,不需要写死任何配置,适配性更强:

c.RootUrl(Function(req) 
    Dim proto = If(req.Headers.GetValues("X-Forwarded-Proto")?.FirstOrDefault(), "http")
    Dim host = If(req.Headers.GetValues("X-Forwarded-Host")?.FirstOrDefault(), req.RequestUri.Host)
    Return $"{proto}://{host}/api"
End Function)

注意:如果你的项目使用的是低于VB 14的版本(对应.NET Framework 4.6以下),不支持$字符串插值语法,替换为String.Format("{0}://{1}/api", proto, host)即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:09:00