我们有一个 ASP.NET Core MVC 控制器,它用以下属性装饰:
[Route("api/v{version}/[controller]
class MyController
{ }
我们使用 Swashbuckle 集成了 Swagger,并使用 SwaggerUI 作为 API 文档。
swagger 中的 API 文档显示了以下路线:
/api/v{version}/MyController/MyAction
我们希望将 {version} 替换为 SwaggerUI 中相应的版本值。
预期输出:
/api/v1/MyController/MyAction --> when viewing docs of v1
/api/v2/MyController/MyAction --> when viewing docs of v2**
我尝试实现
ISchemaFilter
和 IOperationFilter
但找不到可以修改它的地方。
任何指点都会非常有帮助。
谢谢你
这可以通过实施
IDocumentFilter
来实现。您可以尝试以下操作:Asp.Versioning.Mvc
[Route("api/v{version:apiVersion}/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
[HttpGet("Test")]
[ApiVersion("1")]
[ApiExplorerSettings(GroupName = "v1")]
public IActionResult Test1()
{
return Ok();
}
[HttpGet("Test")]
[ApiVersion("2")]
[ApiExplorerSettings(GroupName = "v2")]
public IActionResult Test2()
{
return Ok();
}
}
DocFilter.cs
public class DocFilter : IDocumentFilter
{
public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
{
var oldpaths = swaggerDoc.Paths;
swaggerDoc.Paths = new OpenApiPaths(); //clear old paths
foreach (var path in oldpaths)
{
var key = path.Key.Replace("v{version}", swaggerDoc.Info.Version);
var value = path.Value;
swaggerDoc.Paths.Add(key, value);
}
}
}
程序.cs
...
builder.Services.AddApiVersioning();
builder.Services.AddSwaggerGen(options =>
{
options.SwaggerDoc("v1", new OpenApiInfo{ Version = "v1"});
options.SwaggerDoc("v2", new OpenApiInfo{ Version = "v2"});
options.DocumentFilter<DocFilter>();
});
...
app.UseSwagger(c =>
{
c.RouteTemplate = "api/docs/{documentName}/docs.json";
});
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint($"/api/docs/v1/docs.json", "v1");
c.SwaggerEndpoint($"/api/docs/v2/docs.json", "v2");
});