使用 VersionByNamespaceConvention 时,如何让 Swashbuckle 在 Asp.net Core 3.1 中工作?
How do I get Swashbuckle to work in Asp.net Core 3.1 when using VersionByNamespaceConvention?
我正在使用 VersionByNamespaceConvention。在 Startup.cs 的 ConfigureServices 中我添加了:
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 相同,除了命名空间和 return 值)。
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",但屏幕中间显示
Fetch error - undefined /swagger/v1/swagger.json
如果我只有 v1 版本的控制器,这会起作用。但是随后它显示了如下图所示的版本号,即使这里的版本号已经被选中。
解决方法
我添加了 nuget 包 Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer v4.x 并将以下代码添加到 ConfigureServices,现在它按预期工作了。
services.AddVersionedApiExplorer(o =>
{
o.GroupNameFormat = "'v'VVV";
o.SubstituteApiVersionInUrl = true;
});
你需要使用services.AddVersionedApiExplorer
并设置options.SubstituteApiVersionInUrl=true
告诉swagger替换控制器路由中的版本并配置api版本:
services.AddVersionedApiExplorer(o =>
{
o.GroupNameFormat = "'v'VVV";
o.SubstituteApiVersionInUrl = true;
});
结果:
我正在使用 VersionByNamespaceConvention。在 Startup.cs 的 ConfigureServices 中我添加了:
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 相同,除了命名空间和 return 值)。
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",但屏幕中间显示
Fetch error - undefined /swagger/v1/swagger.json
如果我只有 v1 版本的控制器,这会起作用。但是随后它显示了如下图所示的版本号,即使这里的版本号已经被选中。
解决方法
我添加了 nuget 包 Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer v4.x 并将以下代码添加到 ConfigureServices,现在它按预期工作了。
services.AddVersionedApiExplorer(o =>
{
o.GroupNameFormat = "'v'VVV";
o.SubstituteApiVersionInUrl = true;
});
你需要使用services.AddVersionedApiExplorer
并设置options.SubstituteApiVersionInUrl=true
告诉swagger替换控制器路由中的版本并配置api版本:
services.AddVersionedApiExplorer(o =>
{
o.GroupNameFormat = "'v'VVV";
o.SubstituteApiVersionInUrl = true;
});
结果: