升级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

