当api从另一个项目中提供时,如何在Swashbuckle/Swaggerwork中创建url路径?

Dmi*_*riy 13 c# rest asp.net-web-api swagger swashbuckle

所有.我正在尝试使用Swashbuckle包记录WebApi 2.

如果API单独运行,那么一切都很好用,localhost/api/swagger将我带到ui和localhost/api/swagger/docs/v1到json.

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

现在swashbuckle根本就不起作用了.

  • localhost/api/swagger生成错误无法加载'API.WebApiApplication',当然好吧
  • localhost/web/swagger = 404
  • localhost/web/api/swagger = 404

我试着到处寻找,但我找到的只是解决方法.

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

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

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

我将非常感谢您提供的任何帮助.我真的开始喜欢招摇(和swashbuckle)休息文档.

Ant*_*ace 16

对于Swashbuckle 5.x:

这似乎是由名为EnableSwagger的httpConfiguration扩展方法设置的.Swashbuckle 5.x 迁移自述文件指出这取代了SwaggerSpecConfig.SwaggerDocConfig RootUrl()专门从4.x替换ResolveBasePathUsing().

这实际上与之前的工作原理相同,看起来最大的变化是它被重命名并移入SwaggerDocConfig:

public void RootUrl(Func<HttpRequestMessage, string> rootUrlResolver)
Run Code Online (Sandbox Code Playgroud)

自述文件中的一个例子,为简洁起见进行了调整:

string myCustomBasePath = @"http://mycustombasepath.com";

httpConfiguration
    .EnableSwagger(c =>
        {
            c.RootUrl(req => myCustomBasePath);

            // The rest of your additional metadata goes here
        });
Run Code Online (Sandbox Code Playgroud)

对于Swashbuckle 4.x:

使用SwaggerSpecConfig ResolveBasePathUsing并让lambda读取您的已知端点.

ResolveBasePathUsing:

public SwaggerSpecConfig ResolveBasePathUsing(Func<HttpRequestMessage, string> basePathResolver);
Run Code Online (Sandbox Code Playgroud)

我的API支持负载均衡器,这是提供基址的有用解决方法.这是一个使用ResolveBasePathUsing来解析具有已知基本路径的路径的愚蠢示例.

string myCustomBasePath = @"http://mycustombasepath.com";

SwaggerSpecConfig.Customize(c =>
{
    c.ResolveBasePathUsing((req) => myCustomBasePath);
}
Run Code Online (Sandbox Code Playgroud)

为了清晰起见,我对端点进行了硬编码,但您可以在任何地方进行定义.你甚至可以使用请求对象来尝试清理你的请求uri指向/ web/api而不是/ api.

开发人员去年在GitHub 上对此解决方案发表了评论:

lambda采用当前的HttpRequest(即给定Swagger ApiDeclaration的请求),并返回一个字符串,用作Api的baseUrl.对于负载均衡的应用程序,这应该返回负载平衡器路径.

默认实现如下:

(req) => req.RequestUri.GetLeftPart(UriPartial.Authority) +  req.GetConfiguration().VirtualPathRoot.TrimEnd('/');
Run Code Online (Sandbox Code Playgroud)

...

相对路径,Swagger规范需要绝对路径,因为提供Swagger的URL不必是实际API的URL.

...

lambda传递了一个HttpRequestMessage实例......你应该可以使用它来获取RequestUri等.另一个选项,你可以将主机名放在web.config中并让lambda从那里读取它.