C# .NET 5+Swashbuckle环境下如何获取OpenAPI版本并在控制器返回
实现方法
完全可以通过依赖注入的方式拿到目标值,以下是两种可行的实现方案:
方案1:直接注入Swagger生成配置获取(无额外配置)
Swashbuckle组件的生成配置默认已经注入到容器中,你只需要在控制器中注入IOptions<SwaggerGeneratorOptions>即可读取到OpenAPI规范版本:
- 先引用所需命名空间
using Swashbuckle.AspNetCore.SwaggerGen; using Microsoft.Extensions.Options; using Microsoft.OpenApi;
- 调整控制器代码,补全获取逻辑:
[ApiController] [Route("api/my-app/openapi-version")] public class OpenApiVersionController: ControllerBase { private readonly IOptions<Configuration> _configuration; private readonly IOptions<SwaggerGeneratorOptions> _swaggerGenOptions; // 构造函数注入Swagger生成配置 public OpenApiVersionController(IOptions<Configuration> configuration, IOptions<SwaggerGeneratorOptions> swaggerGenOptions) { _configuration = configuration; _swaggerGenOptions = swaggerGenOptions; } [HttpGet, Route("")] public ActionResult<OpenApiVersion> GetOpenApiVersion() { // 直接从配置中拿到版本枚举,转为对应字符串即可 string version = _swaggerGenOptions.Value.OpenApiVersion.GetStringDisplayName(); return Ok(new OpenApiVersion(version)); } }
该方法返回的值和生成的OpenAPI JSON文件中根节点的openapi/swagger字段完全一致。
方案2:复用统一配置(更推荐)
如果你在服务注册时手动指定过OpenAPI版本,建议将版本值统一放到配置文件中,Swagger注册和控制器都读取同一个配置值,避免后续修改Swagger配置时两处不一致:
- 在appsettings.json中添加配置项:
{ "AppSettings": { "OpenApiSpecVersion": "3.0.1" } }
- 注册Swagger时读取该配置:
// Startup.cs ConfigureServices方法中 services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "你的接口文档", Version = "v1" }); // 读取配置设置版本 var specVersion = Configuration.GetValue<string>("AppSettings:OpenApiSpecVersion") == "3.0.1" ? OpenApiSpecVersion.OpenApi3_0 : OpenApiSpecVersion.OpenApi2_0; c.OpenApiVersion = specVersion; });
- 控制器中直接读取自己的配置即可:
[HttpGet, Route("")] public ActionResult<OpenApiVersion> GetOpenApiVersion() { string version = _configuration.Value.AppSettings.OpenApiSpecVersion; return Ok(new OpenApiVersion(version)); }
注意事项
- .NET 5配套的Swashbuckle.AspNetCore版本推荐使用5.6.3及以上的5.x版本,避免API不兼容问题
- 如果你使用的是Swagger 2.0规范,返回值会自动对应为
2.0,和生成JSON的swagger字段值匹配
内容的提问来源于stack exchange,提问作者Fabien
相关产品推荐
相关产品推荐

