【问题标题】:How do I get Swashbuckle to work in Asp.net Core 3.1 when using VersionByNamespaceConvention?使用 VersionByNamespaceConvention 时,如何让 Swashbuckle 在 Asp.net Core 3.1 中工作?
【发布时间】:2020-02-16 21:09:13
【问题描述】:

我正在使用 VersionByNamespaceConvention。在 ConfigureServices 的 Startup.cs 中,我添加了:

        services.AddApiVersioning(options =>
        {
            options.Conventions.Add(new VersionByNamespaceConvention());
        });

        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
            c.SwaggerDoc("v2", new OpenApiInfo { Title = "My API", Version = "v2" });
        });

并在配置中

        app.UseSwagger();

        // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.),
        // specifying the Swagger JSON endpoint.
        app.UseSwaggerUI(c =>
        {
            c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
            c.SwaggerEndpoint("/swagger/v2/swagger.json", "My API V2");
        });

在项目的根目录中,我有文件夹 v1 和 v2,在这些文件夹下我有一个 Controllers 文件夹。控制器的代码(v2 与 v1 相同,除了命名空间和返回值)。

namespace WebApitest.v1.Controllers
{
    [ApiController]
    [Route("v{version:apiVersion}/[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        [HttpGet]
        public string Get()
        {
            return "v1";
        }
    }
}

api 本身运行良好,但 Swagger 渲染未按预期运行。

当打开https://localhost:44307/swagger/index.html时,它会在右上角显示一个下拉菜单,显示“My API V1”和“My API V2”,但屏幕中间显示的是

获取错误 - 未定义 /swagger/v1/swagger.json

如果我只有 v1 版本的控制器,这将有效。但是它会显示如下图所示的版本号,即使这里的版本号已经被选中。

解决方案

我添加了 nuget 包 Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer v4.x 并将以下代码添加到 ConfigureServices,现在它按预期工作。

        services.AddVersionedApiExplorer(o =>
        {
            o.GroupNameFormat = "'v'VVV";
            o.SubstituteApiVersionInUrl = true;
        });

【问题讨论】:

  • 你能分享你的控制器的代码吗?
  • @bmartins 已添加!

标签: asp.net-core swagger swashbuckle


【解决方案1】:

你需要使用services.AddVersionedApiExplorer并设置options.SubstituteApiVersionInUrl=true告诉swagger替换控制器路由中的版本并配置api版本:

services.AddVersionedApiExplorer(o =>
{
      o.GroupNameFormat = "'v'VVV";
      o.SubstituteApiVersionInUrl = true;
});

结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2018-06-24
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    相关资源
    最近更新 更多