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

求助:Swashbuckle无法显示自定义类型属性的注释信息

解决Swashbuckle无法显示自定义类型属性注释的问题

我之前也碰到过完全一样的情况——内置类型、集合类型的属性注释都能正常显示,唯独单个自定义类型的属性注释死活不出来。下面是我亲测有效的解决方法:

第一步:让项目生成XML注释文件

Swashbuckle依赖XML注释文件来读取代码里的注释,所以首先得开启这个功能:

  • 右键你的项目 → 选择「属性」
  • 切换到「生成」选项卡
  • 在「输出」区域里,勾选「XML文档文件」,可以保留默认路径(一般是$(OutputPath)$(AssemblyName).xml),也可以自己指定位置

第二步:配置Swashbuckle读取XML注释

在Program.cs(旧项目是Startup.cs)里找到Swagger的配置代码,添加读取XML文件的逻辑:

using System.Reflection;

builder.Services.AddSwaggerGen(c =>
{
    // 拼接当前项目的XML注释文件路径
    var xmlFileName = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
    var xmlFilePath = Path.Combine(AppContext.BaseDirectory, xmlFileName);
    
    // 让Swagger加载XML注释,includeControllerXmlComments设为true可以同时读取控制器的注释
    c.IncludeXmlComments(xmlFilePath, includeControllerXmlComments: true);

    // 如果Order、OrderLine这类实体类在单独的类库项目里,还要添加对应类库的XML文件路径
    // var libraryXmlFileName = "YourLibraryAssemblyName.xml";
    // var libraryXmlFilePath = Path.Combine(AppContext.BaseDirectory, libraryXmlFileName);
    // c.IncludeXmlComments(libraryXmlFilePath);
});

第三步:(可选)用自定义SchemaFilter强制提取属性注释

如果上面的步骤做完后,单个自定义类型的属性注释还是不显示,那可能是Swashbuckle默认的注释提取逻辑漏掉了这类属性。这时候可以写一个自定义SchemaFilter来手动提取:

先创建Filter类:

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

public class CustomPropertySchemaFilter : ISchemaFilter
{
    private readonly XDocument _xmlDoc;

    public CustomPropertySchemaFilter(string xmlFilePath)
    {
        if (File.Exists(xmlFilePath))
        {
            _xmlDoc = XDocument.Load(xmlFilePath);
        }
    }

    public void Apply(OpenApiSchema schema, SchemaFilterContext context)
    {
        // 只处理属性成员
        var propertyInfo = context.MemberInfo as PropertyInfo;
        if (propertyInfo == null || _xmlDoc == null) return;

        // 拼接XML注释里的成员路径
        var memberPath = $"P:{propertyInfo.DeclaringType.FullName}.{propertyInfo.Name}";
        var commentNode = _xmlDoc.Descendants("member")
            .FirstOrDefault(m => m.Attribute("name")?.Value == memberPath);

        // 如果找到注释节点,把summary内容设为属性的描述
        if (commentNode != null)
        {
            var summaryNode = commentNode.Element("summary");
            if (summaryNode != null)
            {
                schema.Description = summaryNode.Value.Trim();
            }
        }
    }
}

然后在Swagger配置里注册这个Filter:

builder.Services.AddSwaggerGen(c =>
{
    var xmlFileName = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
    var xmlFilePath = Path.Combine(AppContext.BaseDirectory, xmlFileName);
    
    c.IncludeXmlComments(xmlFilePath, includeControllerXmlComments: true);
    
    // 注册自定义SchemaFilter,传入XML文件路径
    c.SchemaFilter<CustomPropertySchemaFilter>(xmlFilePath);
});

做完这些操作后,你的OneOrderLine属性的注释应该就能在Swagger UI里正常显示了。


内容的提问来源于stack exchange,提问作者Mathias Rönnlund

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:40:06