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

同一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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 21:54:54