18

全部。我正在尝试使用 Swashbuckle 包记录 WebApi 2。

如果 API 自己运行,那么一切都很好,即localhost/api/swagger将我带到 ui 和localhost/api/swagger/docs/v1到 json。

但是,生产应用程序通过在另一个 Web 项目(主应用程序之一)中从 global.asax.cs 运行该项目的 webapiconfig 方法来初始化同一个 Webapi 项目。所以 api url 看起来像localhost/web/api而不是 localhost/api。

现在 swashbuckle 根本不像那样工作。

  • localhost/api/swagger 生成错误 cannot load 'API.WebApiApplication', 当然可以
  • 本地主机/网络/招摇= 404
  • 本地主机/web/api/swagger = 404

我试图到处寻找,但我发现的只是解决方法。

c.RootUrl(req => req.RequestUri.GetLeftPart(UriPartial.Authority) + VirtualPathUtility.ToAbsolute("~/").TrimEnd('/'));

不幸的是它不起作用,现在也许它应该,我只需要改变一些东西,但我什至不知道这个属性究竟期望什么以及应该设置什么。

可能它甚至不适用 - 也许我们的设置需要其他东西或一些花哨的代码更改。

我将不胜感激您能提供的任何帮助。我真的开始喜欢大摇大摆(和 swashbuckle)的其余文档。

4

1 回答 1

20

对于 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 从那里读取它。

于 2015-05-02T00:32:54.690 回答