You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级Swashbuckle.AspNetCore至v9.x后无法兼容OpenAPI 3.x的解决方案求助

升级Swashbuckle.AspNetCore至v9.x后无法兼容OpenAPI 3.x的解决方案求助

我正在把ASP.NET Core项目(目标框架.NET 8)里的Swashbuckle.AspNetCore包从7.3.2版本升级到最新的9.0.3版本。后续项目会跳过.NET 9直接升级到.NET 10,但那是很久以后的事了。

之前在Startup.Configure里只需要一行app.UseSwagger();,就能正常生成开头为"openapi": "3.0.1"的swagger.json,一切都运行顺畅。但升级包之后,Swagger文档页面直接弹出报错:

Unable to render this definition
The provided definition does not specify a valid version field. Please indicate a valid Swagger or OpenAPI version field. Supported version fields are swagger: "2.0" and those that match openapi: 3.x.y (for example, openapi: 3.1.0).

奇怪的是,升级后生成的swagger.json开头是"openapi": "3.0.4",这明明符合3.x.y的格式要求啊?

我试过修改代码:

app.UseSwagger(options => options.OpenApiVersion = Microsoft.OpenApi.OpenApiSpecVersion.OpenApi2_0);

这样页面能正常显示了,生成的swagger.json开头变成"swagger": "2.0",但这又引出了别的问题(这里就不展开说了)。如果把OpenApi2_0换成OpenApi3_0,又回到了之前的错误——毕竟这本来就是默认值,指定了也没区别。

有没有人知道,要怎么配置才能让最新的Swashbuckle.AspNetCore包正常兼容OpenAPI 3.x呢?

注:这个问题被标记过重复,但提供的所有答案都解决不了我的问题。大部分答案并不适用于ASP.NET Core搭配Swashbuckle的场景,最相关的几个建议是在UseSwaggerUI里配置SwaggerEndpoint,但我们项目里本来就已经这么做了:

在Configure里我们特意没调用app.UseSwaggerUI(),而是通过DI的方式在ConfigureServices里配置:

// Configure 中的代码
//do not call this otherwise get /swagger/index.html page. We have our own page.
//app.UseSwaggerUI();
//dont configure options here. Do it in ConfigureServices so we can use DI with SwaggerUIOptions.
// ConfigureServices 中的代码
var filePath = Path.Combine(System.AppContext.BaseDirectory, "SI.Gbrmpa.Eotr.Web.xml");
services.AddSwaggerGen(options => {
    options.IncludeXmlComments(filePath);
    options.AddSecurityDefinition("bearerAuth", new OpenApiSecurityScheme {
        Type = SecuritySchemeType.Http,
        Scheme = "bearer",
        BearerFormat = "JWT",
        Description = "JWT Authorization header using the Bearer scheme."
    });
    options.AddSecurityRequirement(new OpenApiSecurityRequirement {
        {
            new OpenApiSecurityScheme {
                Reference = new OpenApiReference {
                    Type = ReferenceType.SecurityScheme,
                    Id = "bearerAuth"
                }
            },
            new string[] {}
        }
    });
    options.SchemaFilter<Filters.EnumSchemaFilter>();
});

services.AddOptions<SwaggerUIOptions>()
    .Configure((swaggerUiOptions) => 
        //configure here and not app.UseSwaggerUI() so that we can use DI with SwaggerUIOptions
    {
        swaggerUiOptions.SwaggerEndpoint("/swagger/v1/swagger.json", "v1");
    });

这些配置在7.3.2版本下完全正常,能正确找到swagger.json文件,也能识别版本号。现在包升级后,swagger.json的位置没变,版本号格式也合法,实在搞不懂问题出在哪。


内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 12:58:03