SwaggerUI 在向 API 发出请求时生成一个端口号。有什么办法可以阻止这种行为吗?
SwaggerUI generates a port number when making the request to the API. Is there any way to stop this behaviour?
我有一个 Web API 托管在 Pivotal Cloud foundry 上;其中包括它的 Swagger 文档。
但是,每当我尝试测试任何 API 端点时,Swagger 都会在请求 URL 主机后添加一个端口号 :port,并且这会阻止与 API 端点建立连接,因此不会返回任何数据。出于某种原因,托管在 pivotal 上的 APIs 对端口号不满意;而只是路线 url 似乎工作正常。
我正在托管 ASP.NET Web API 并使用 Swashbuckle Swagger Nuget 包生成文档。
有什么办法可以强制Swagger在发送api请求时去掉端口号吗?
我知道这是一个相当晚的回复,但我添加它是为了让将来 运行 参与其中的其他人能够快速找到解决方案。
我 运行 遇到了这个完全相同的问题。我在 Swashbuckle Git repo:
上找到了这个文档
By default, the service root url is inferred from the request used to
access the docs. However, there may be situations (e.g. proxy and
load-balanced environments) where this does not resolve correctly. You
can workaround this by providing your own code to determine the root
URL.
在您的 App_Start/SwaggerConfig.cs
文件中,您需要取消注释 c.RootUrl(req => GetRootUrlFromAppConfig())
的行并实施方法 GetRootUrlFromAppConfig()
以便它 returns 正确的根 url 为您的应用程序(见下面的屏幕截图)
下面是 GetRootUrlFromAppConfig()
的一些实施示例,您需要确定哪一个最适合您的具体情况:https://github.com/domaindrivendev/Swashbuckle/issues/705
也许这会有所帮助。 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"变量。
我有一个 Web API 托管在 Pivotal Cloud foundry 上;其中包括它的 Swagger 文档。
但是,每当我尝试测试任何 API 端点时,Swagger 都会在请求 URL 主机后添加一个端口号 :port,并且这会阻止与 API 端点建立连接,因此不会返回任何数据。出于某种原因,托管在 pivotal 上的 APIs 对端口号不满意;而只是路线 url 似乎工作正常。
我正在托管 ASP.NET Web API 并使用 Swashbuckle Swagger Nuget 包生成文档。
有什么办法可以强制Swagger在发送api请求时去掉端口号吗?
我知道这是一个相当晚的回复,但我添加它是为了让将来 运行 参与其中的其他人能够快速找到解决方案。
我 运行 遇到了这个完全相同的问题。我在 Swashbuckle Git repo:
上找到了这个文档By default, the service root url is inferred from the request used to access the docs. However, there may be situations (e.g. proxy and load-balanced environments) where this does not resolve correctly. You can workaround this by providing your own code to determine the root URL.
在您的 App_Start/SwaggerConfig.cs
文件中,您需要取消注释 c.RootUrl(req => GetRootUrlFromAppConfig())
的行并实施方法 GetRootUrlFromAppConfig()
以便它 returns 正确的根 url 为您的应用程序(见下面的屏幕截图)
下面是 GetRootUrlFromAppConfig()
的一些实施示例,您需要确定哪一个最适合您的具体情况:https://github.com/domaindrivendev/Swashbuckle/issues/705
也许这会有所帮助。 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"变量。