代理OWIN自托管Web API中Swashbuckle的HTTPS端口异常问题
解决Swagger UI请求错误端口的问题
你的问题是Swashbuckle自动生成的API根URL错误带上了HTTPS不应该有的80端口,导致Swagger UI请求地址无效。可以通过配置RootUrl方法强制指定正确的根URL来解决:
方法一:硬编码固定根URL
适合部署环境固定的场景,直接指定正确的根地址:
configSwag.EnableSwagger("docs/{apiVersion}/swagger", c => { var baseDirectory = AppDomain.CurrentDomain.BaseDirectory; var commentsFileName = Assembly.GetExecutingAssembly().GetName().Name + ".XML"; var commentsFile = Path.Combine(baseDirectory, commentsFileName); c.Schemes(new string[] { "https" }); // 指定正确的根URL,去掉多余的80端口 c.RootUrl(_ => "https://api.domain.com"); c.SingleApiVersion("v1", "MechaChat v1 Docs"); c.IncludeXmlComments(commentsFile); c.PrettyPrint(); }).EnableSwaggerUi("v1/docs/{*assetPath}", c => { c.DocExpansion(DocExpansion.List); c.SupportedSubmitMethods("GET", "POST"); });
方法二:从代理请求头动态获取(更灵活)
如果API部署在反向代理之后,可以从代理传递的请求头(如X-Forwarded-Host)动态获取主机地址,适配多环境:
configSwag.EnableSwagger("docs/{apiVersion}/swagger", c => { var baseDirectory = AppDomain.CurrentDomain.BaseDirectory; var commentsFileName = Assembly.GetExecutingAssembly().GetName().Name + ".XML"; var commentsFile = Path.Combine(baseDirectory, commentsFileName); c.Schemes(new string[] { "https" }); // 从代理头获取主机地址,无值时fallback到固定地址 c.RootUrl(req => { if (req.Headers.ContainsKey("X-Forwarded-Host")) { var forwardedHost = req.Headers.GetValues("X-Forwarded-Host").FirstOrDefault(); if (!string.IsNullOrEmpty(forwardedHost)) { return $"https://{forwardedHost}"; } } return "https://api.domain.com"; }); c.SingleApiVersion("v1", "MechaChat v1 Docs"); c.IncludeXmlComments(commentsFile); c.PrettyPrint(); }).EnableSwaggerUi("v1/docs/{*assetPath}", c => { c.DocExpansion(DocExpansion.List); c.SupportedSubmitMethods("GET", "POST"); });
原理:RootUrl方法会覆盖Swashbuckle自动推导的根URL,确保生成的API地址使用正确的HTTPS主机地址,不再错误附加80端口。
内容的提问来源于stack exchange,提问作者Xd_Golden_Tiger
相关产品推荐
相关产品推荐

