对于 Swashbuckle 5.x:
这似乎是由名为 EnableSwagger 的 httpConfiguration 扩展方法设置的。Swashbuckle 5.x迁移自述文件指出,它取代了 SwaggerSpecConfig。SwaggerDocConfig RootUrl() 专门替换了 4.x 中的 ResolveBasePathUsing()。
这实际上与以前的工作方式相同,看起来最大的变化是它被重命名并移至SwaggerDocConfig:
public void RootUrl(Func<HttpRequestMessage, string> rootUrlResolver)
自述文件中的一个示例,为简洁起见进行了调整:
string myCustomBasePath = @"http://mycustombasepath.com";
httpConfiguration
.EnableSwagger(c =>
{
c.RootUrl(req => myCustomBasePath);
// The rest of your additional metadata goes here
});
对于 Swashbuckle 4.x:
使用 SwaggerSpecConfig ResolveBasePathUsing 并让您的 lambda 读取您的已知端点。
ResolveBasePath 使用:
public SwaggerSpecConfig ResolveBasePathUsing(Func<HttpRequestMessage, string> basePathResolver);
我的 API 位于负载均衡器后面,这是提供基地址的有用解决方法。这是一个使用 ResolveBasePathUsing 来解析具有已知基本路径的路径的愚蠢示例。
string myCustomBasePath = @"http://mycustombasepath.com";
SwaggerSpecConfig.Customize(c =>
{
c.ResolveBasePathUsing((req) => myCustomBasePath);
}
为了清楚起见,我对端点进行了硬编码,但您可以在任何地方定义它。您甚至可以使用请求对象尝试清理您的请求 uri以指向 /web/api 而不是 /api。
开发人员去年在 GitHub 上评论了这个解决方法:
lambda 接受当前的 HttpRequest(即对给定 Swagger ApiDeclaration 的请求)并应返回一个字符串以用作您的 Api 的 baseUrl。对于负载平衡的应用程序,这应该返回负载平衡器路径。
默认实现如下:
(req) => req.RequestUri.GetLeftPart(UriPartial.Authority) + req.GetConfiguration().VirtualPathRoot.TrimEnd('/');
...
关于相对路径,Swagger 规范需要绝对路径,因为提供 Swagger 的 URL 不必是实际 API 的 URL。
...
lambda 被传递了一个 HttpRequestMessage 实例......您应该能够使用它来获取 RequestUri 等。另一种选择,您可以将主机名放在您的 web.config 中并让 lambda 从那里读取它。