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

如何在Swashbuckle.AspNetCore中展示外部库接口的XML注释

你当前的配置仅加载了Web入口程序集的XML注释文件,引用的第三方类库/内部NuGet包的XML注释未被Swagger加载,因此接口可正常展示但缺失注释信息,按以下步骤操作即可解决:

解决步骤

1. 前置配置(针对被引用的类库/内部NuGet包)

  • 打开类库项目的属性页,切换到「生成」标签
  • 勾选「输出」分类下的「XML文档文件」选项,.NET Core/.NET 5+ 类库默认输出路径为bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml
  • 如果是内部NuGet包,需要在打包时将XML文件包含进nupkg,安装后会自动复制到主项目的输出目录

2. 修改Swagger生成配置

在原有配置基础上增加逻辑,自动扫描加载所有存在对应XML文件的引用程序集注释,参考代码如下:

services.AddSwaggerGen(gen =>
{
    // 保留原有加载入口程序集XML的逻辑
    var entryAssembly = Assembly.GetEntryAssembly()!;
    var entryXmlPath = Path.Combine(AppContext.BaseDirectory, $"{entryAssembly.GetName().Name}.xml");
    gen.IncludeXmlComments(entryXmlPath, includeControllerXmlComments: true);

    // 新增:加载所有引用程序集的XML注释(存在则加载)
    var referencedAssemblies = entryAssembly.GetReferencedAssemblies();
    foreach (var assemblyName in referencedAssemblies)
    {
        var libXmlPath = Path.Combine(AppContext.BaseDirectory, $"{assemblyName.Name}.xml");
        if (File.Exists(libXmlPath))
        {
            gen.IncludeXmlComments(libXmlPath, includeControllerXmlComments: true);
        }
    }
});

3. 可选:仅加载指定前缀的内部NuGet包注释

如果不想加载所有引用库的XML,可通过程序集名称前缀过滤,比如内部NuGet统一前缀为Company.Base.,调整判断逻辑即可:

if (assemblyName.Name?.StartsWith("Company.Base.") == true && File.Exists(libXmlPath))
{
    gen.IncludeXmlComments(libXmlPath, includeControllerXmlComments: true);
}

注意:如果发布后注释仍不显示,可在主项目的.csproj文件中添加如下配置,强制将所有引用包的XML文档复制到输出目录:

<Target Name="CopyReferenceXmlToOutput" AfterTargets="ResolveReferences">
  <ItemGroup>
    <ReferenceCopyLocalPaths Include="@(ReferenceCopyLocalPaths)" Condition="'%(Extension)' == '.xml'" />
  </ItemGroup>
</Target>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 11:24:03