将路由属性中带有大括号的占位符替换为 Swagger 文档中的实际值

问题描述 投票:0回答:1

我们有一个 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
但找不到可以修改它的地方。

任何指点都会非常有帮助。

谢谢你

asp.net-core asp.net-core-mvc swagger
1个回答
0
投票

这可以通过实施

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");
});

测试

© www.soinside.com 2019 - 2024. All rights reserved.