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

如何在ASP.NET Core Swagger(Swashbuckle.AspNetCore)中设置控制器描述?

解决ASP.NET Core WebApi Swagger控制器描述不显示且与API版本控制冲突的问题

针对你遇到的Swagger控制器注释不生效,同时[ApiExplorerSettings]属性与版本分组冲突的问题,这里提供两种可行的解决方案:

方法一:在同一个ApiExplorerSettings属性中同时配置分组和显示名称

这是最直接的解决方案,无需额外代码,只需在控制器上修改[ApiExplorerSettings]属性,同时指定GroupName(版本分组)和DisplayName(控制器显示名称)即可:

/// <summary>
/// Uredsko poslovanje API
/// </summary>
[Authorize]
[Route("api/[controller]")]
[ApiExplorerSettings(GroupName = "v2", DisplayName = "Uredsko poslovanje API")] // 同时设置分组和显示名
public class UredskoPoslovanjeController : Controller
{
    private LinkDbContext ctx;
    public UredskoPoslovanjeController(LinkDbContext ctx) { this.ctx = ctx; }

    // 控制器方法代码...
}

这样既保留了API版本控制的分组需求,又能让Swagger UI显示你期望的控制器描述,完美解决属性冲突问题。

方法二:自定义IDocumentFilter自动读取控制器注释

如果你的项目中有多个控制器,不想手动为每个控制器添加DisplayName,可以通过自定义Swagger文档过滤器自动读取XML注释中的<summary>内容作为控制器显示名称,同时保留原有的版本分组:

1. 创建自定义文档过滤器

using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using System.Reflection;
using System.Xml.Linq;

public class ControllerSummaryDocumentFilter : IDocumentFilter
{
    private readonly XDocument _xmlDocumentation;

    public ControllerSummaryDocumentFilter(string xmlDocPath)
    {
        if (File.Exists(xmlDocPath))
        {
            _xmlDocumentation = XDocument.Load(xmlDocPath);
        }
    }

    public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
    {
        foreach (var apiDesc in context.ApiDescriptions)
        {
            // 获取控制器名称
            var controllerName = apiDesc.ActionDescriptor.RouteValues["controller"];
            // 构建XML注释中控制器的成员路径(替换成你的实际命名空间)
            var controllerMemberPath = $"T:{Assembly.GetExecutingAssembly().GetName().Name}.Controllers.{controllerName}Controller";
            
            // 查找对应的XML注释节点
            var controllerCommentNode = _xmlDocumentation?
                .Descendants("member")
                .FirstOrDefault(m => m.Attribute("name")?.Value == controllerMemberPath);

            if (controllerCommentNode != null)
            {
                var summaryNode = controllerCommentNode.Element("summary");
                if (summaryNode != null && !string.IsNullOrWhiteSpace(summaryNode.Value.Trim()))
                {
                    // 设置控制器显示名称,同时保留原有的版本分组
                    apiDesc.ActionDescriptor.DisplayName = summaryNode.Value.Trim();
                }
            }
        }
    }
}

2. 在Swagger配置中注册过滤器

首先确保你已经启用了XML注释生成:右键项目→属性→生成→勾选「XML文档文件」。然后在Program.cs(或Startup.cs)中配置Swagger时添加这个过滤器:

var builder = WebApplication.CreateBuilder(args);

// 注册Swagger服务
builder.Services.AddSwaggerGen(c =>
{
    // 配置Swagger文档信息
    c.SwaggerDoc("v2", new OpenApiInfo { Title = "你的API名称", Version = "v2" });
    
    // 获取XML注释文件路径
    var xmlFileName = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
    var xmlFilePath = Path.Combine(AppContext.BaseDirectory, xmlFileName);
    
    // 包含XML注释
    c.IncludeXmlComments(xmlFilePath);
    // 添加自定义文档过滤器
    c.DocumentFilter<ControllerSummaryDocumentFilter>(xmlFilePath);
});

var app = builder.Build();

// 启用Swagger中间件
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/swagger/v2/swagger.json", "你的API v2");
    });
}

// 其他中间件配置...

app.Run();

注意事项

  • 确保XML注释文件的生成路径正确,项目编译时能成功生成该文件;
  • 方法二中的控制器成员路径需要匹配你实际的控制器命名空间,比如如果控制器在MyApi.Controllers下,要把T:{Assembly...}部分改成T:MyApi.Controllers.{controllerName}Controller;
  • 两种方法都能保留原有的API版本分组功能,不会和GroupName设置冲突。

内容的提问来源于stack exchange,提问作者mariob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:16:08