同一C#项目中创建多区域带版本控制的Swagger文档可行吗?
同一C#项目配置多区域带版本控制的Swagger文档方案
你的结论不正确,ASP.NET Core项目完全可以配置多个独立的Swagger实例,实现分区域、带版本控制的文档展示。下面是具体的实现步骤:
1. 基础依赖安装
确保项目中已安装Swashbuckle.AspNetCore、Microsoft.AspNetCore.Mvc.Versioning和Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer这三个NuGet包。
2. 配置API版本管理
在Program.cs中添加API版本相关配置,让系统识别和管理不同版本的接口:
builder.Services.AddApiVersioning(options => { options.ReportApiVersions = true; // 响应头返回支持的版本信息 options.AssumeDefaultVersionWhenUnspecified = true; options.DefaultApiVersion = new ApiVersion(1, 0); }); builder.Services.AddVersionedApiExplorer(options => { options.GroupNameFormat = "'v'VVV"; // 版本格式为v1、v2 options.SubstituteApiVersionInUrl = true; });
3. 配置多区域Swagger文档
先获取API版本描述提供器,然后为每个区域+版本的组合定义Swagger文档,并设置文档包含规则:
var apiVersionDescriptionProvider = builder.Services.BuildServiceProvider() .GetRequiredService<IApiVersionDescriptionProvider>(); builder.Services.AddSwaggerGen(options => { // 定义所有区域+版本的Swagger文档 var areas = new[] { "api1", "api2" }; foreach (var area in areas) { foreach (var description in apiVersionDescriptionProvider.ApiVersionDescriptions) { options.SwaggerDoc($"{area}-{description.GroupName}", new OpenApiInfo { Title = $"{area} 业务API", Version = description.ApiVersion.ToString(), Description = $"{area}业务域下的{description.GroupName}版本接口文档" }); } } // 配置文档包含规则:只匹配对应区域和版本的接口 options.DocInclusionPredicate((docName, apiDesc) => { var docParts = docName.Split('-'); if (docParts.Length != 2) return false; var targetArea = docParts[0]; var targetVersion = docParts[1].TrimStart('v'); return apiDesc.RelativePath.StartsWith($"{targetArea}/") && apiDesc.ApiVersion.ToString() == targetVersion; }); // 可选:加载XML注释,显示接口详情(需在项目属性中启用XML文档文件生成) var xmlFilePath = Path.Combine(AppContext.BaseDirectory, $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"); options.IncludeXmlComments(xmlFilePath); });
4. 配置多Swagger UI端点
在Program.cs的中间件配置部分,为每个区域单独设置Swagger UI访问路径:
app.UseSwagger(); // 启用Swagger JSON接口 // 区域1的Swagger UI app.UseSwaggerUI(options => { options.RoutePrefix = "api1/swagger"; // 访问路径:/api1/swagger foreach (var description in apiVersionDescriptionProvider.ApiVersionDescriptions) { options.SwaggerEndpoint($"/swagger/api1-{description.GroupName}/swagger.json", $"区域1 API {description.GroupName}"); } }); // 区域2的Swagger UI app.UseSwaggerUI(options => { options.RoutePrefix = "api2/swagger"; // 访问路径:/api2/swagger foreach (var description in apiVersionDescriptionProvider.ApiVersionDescriptions) { options.SwaggerEndpoint($"/swagger/api2-{description.GroupName}/swagger.json", $"区域2 API {description.GroupName}"); } });
5. 标记区域与版本的控制器示例
在控制器上通过路由和特性指定所属区域和版本:
// 区域1 v1版本控制器 [ApiController] [ApiVersion("1.0")] [Route("api1/v{version:apiVersion}/[controller]")] public class OrderController : ControllerBase { [HttpGet] public IActionResult GetOrders() { return Ok(new List<string> { "Order001", "Order002" }); } } // 区域1 v2版本控制器 [ApiController] [ApiVersion("2.0")] [Route("api1/v{version:apiVersion}/[controller]")] public class OrderV2Controller : ControllerBase { [HttpGet] public IActionResult GetOrders() { return Ok(new List<object> { new { Id = "Order001", Amount = 100 }, new { Id = "Order002", Amount = 200 } }); } }
配置完成后,访问http://someapi.com/api1/swagger即可看到区域1的v1、v2版本接口文档,区域2的文档则通过http://someapi.com/api2/swagger访问。
内容的提问来源于stack exchange,提问作者user23137202
相关产品推荐
相关产品推荐

