我在 Pivotal Cloud foundry 上托管了一个 Web API;其中包括它的 Swagger 文档。
但是,每当我尝试测试任何 API 端点时,Swagger 都会在请求 URL 中的主机后面放置一个端口号 :port,这会阻止与 API 端点建立连接,并且因此没有数据返回。出于某种原因,托管在 pivotal 上的 API 对端口号不满意;而只是路由 url 似乎工作正常。
我正在托管一个 ASP.NET Web API 并使用 Swashbuckle Swagger Nuget 包来生成文档。
有什么办法可以强制Swagger在发送api请求时去掉端口号吗?
最佳答案
也许这会有所帮助。 mknopf 的答案是正确的。由于声誉点的限制,我无法投票。但是,我在这里起草我的代码,供其他人在遇到此问题时快速解决。
在 SwaggerConfig.cs 文件中(仅当您从源文件而不是配置文件本身设置配置时)更新 RoolUrl 语句,如下所示:
c.RootUrl(req => ComputeHostAsSeenByOriginalClient(req));
然后在您的 swaggerconfig.cs 文件中添加以下方法:
private static string ComputeHostAsSeenByOriginalClient(HttpRequestMessage req)
{
var authority = req.Headers.Host;
var scheme = req.RequestUri.Scheme;
if (req.Headers.Contains("X-Forwarded-Host"))
{
var xForwardedHost = req.Headers.GetValues("X-Forwarded-Host").First();
var firstForwardedHost = xForwardedHost.Split(',')[0];
authority = firstForwardedHost;
}
if (req.Headers.Contains("X-Forwarded-Proto"))
{
var xForwardedProto = req.Headers.GetValues("X-Forwarded-Proto").First();
if (xForwardedProto.IndexOf(",") != -1)
{
//when multiple apache, X-Forwarded-Proto is also multiple ...
xForwardedProto = xForwardedProto.Split(',')[0];
}
scheme = xForwardedProto;
}
return scheme + "://" + authority;
}
如果根 url 仍然有问题,我建议通过记录值来调试 req.Headers
并查看哪个 header 成员用于“authority”变量。
关于javascript - SwaggerUI 在向 API 发出请求时生成一个端口号。有什么办法可以阻止这种行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45707849/