为 ASP.NET Core 应用提供自定义 XML API 文档生成和 HTML 文档页面。
- 框架: ASP.NET Core (基于 .NET 9.0+)
- 语言: C# 12+ with Nullable Reference Types
- 依赖: Microsoft.AspNetCore.App Framework Reference
- 序列化: System.Xml.Serialization
- API 探索: Microsoft.AspNetCore.Mvc.ApiExplorer
- .NET 9.0 或更高版本
- 支持的操作系统: Windows, Linux, macOS
- IDE (可选): Visual Studio 2022, VS Code, Rider
确保已安装 .NET 9.0 SDK 或更高版本:
dotnet --version如需安装,请访问 .NET 下载页面。
git clone https://github.com/AterDev/AspNetCore.OpenApi.Xml.git
cd AspNetCore.OpenApi.Xmldotnet restoredotnet buildcd Demo.WebApi
dotnet run访问 http://localhost:5276/api-doc 查看生成的文档页面。
- ✅ 基于 ASP.NET Core ApiExplorer 自动生成 API 文档
- ✅ 输出简洁的 XML 格式文档
- ✅ 提供交互式 HTML 文档页面
- ✅ 支持类型详情查看(模态框)
- ✅ 显示验证规则(长度、范围、正则表达式等)
- ✅ 按控制器分组的接口列表
- ✅ 响应式设计,GitHub 风格 UI
dotnet add package AspNetCore.OpenApi.Xml在 Program.cs 中注册服务并映射文档页面:
using AspNetCore.OpenApi.Xml.Extensions;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
// 注册 API 文档生成器
builder.Services.AddApiXmlDocumentGenerator();
var app = builder.Build();
// 映射 HTML 文档页面(默认路径: /api-doc)
app.MapApiDocumentationPage();
// 可选:映射 XML 文档端点
app.MapGet("/__api-doc.xml", (IApiXmlDocumentGenerator gen) =>
Results.Text(gen.GenerateXml("My API", "v1"), "application/xml"));
app.MapControllers();
app.Run();启动应用后,访问:
- HTML 文档页面:
http://localhost:5000/api-doc - XML 文档:
http://localhost:5000/__api-doc.xml
- 按控制器分组显示所有接口
- 支持折叠/展开分组
- 显示 HTTP 方法(GET、POST、PUT、DELETE 等)
- 显示路由路径
点击接口后显示:
- HTTP 方法和完整路由
- 路由参数
- 查询参数
- 请求头
- 请求体(含字段类型和验证规则)
- 响应格式(状态码、内容类型、响应体)
- 点击类型名称打开模态框
- 查看类型的所有字段
- 显示验证规则(最小/最大长度、范围、正则表达式等)
- 支持嵌套类型查看
- 显示枚举成员及描述
app.MapApiDocumentationPage("/docs");app.MapApiDocumentationPage("/api-doc", "My Custom API", "v2.0");public class MyController : ControllerBase
{
private readonly IApiXmlDocumentGenerator _generator;
public MyController(IApiXmlDocumentGenerator generator)
{
_generator = generator;
}
[HttpGet("/api/doc.xml")]
public IActionResult GetXmlDoc()
{
var xml = _generator.GenerateXml("My API", "v1");
return Content(xml, "application/xml");
}
}public class MyService
{
private readonly IApiXmlDocumentGenerator _generator;
public MyService(IApiXmlDocumentGenerator generator)
{
_generator = generator;
}
public void ProcessApiDoc()
{
var document = _generator.Generate("My API", "v1");
// 访问所有端点
foreach (var endpoint in document.Endpoints)
{
Console.WriteLine($"{endpoint.Method} {endpoint.Path}");
}
// 访问所有模型
foreach (var model in document.Models)
{
Console.WriteLine($"Model: {model.Name}");
}
}
}查看 Demo.WebApi 项目获取完整示例。
运行示例:
cd Demo.WebApi
dotnet run然后访问 http://localhost:5276/api-doc
目前项目主要通过 Demo.WebApi 项目进行功能验证。
启动 Demo.WebApi 项目后,可以访问以下端点测试不同功能:
# 访问 HTML 文档页面
curl http://localhost:5276/api-doc
# 获取 XML 格式文档
curl http://localhost:5276/__api-doc.xml
# 测试泛型类型(详见 GENERIC_TESTS.md)
curl http://localhost:5276/api/GenericsTest/kvp
curl http://localhost:5276/api/GenericsTest/nested-dictAspNetCore.OpenApi.Xml/
├── OpenApi.Xml.Core/ # 核心领域模型和序列化
│ ├── Models/ # API 文档数据模型
│ │ └── ApiDocument.cs # 文档、端点、请求、响应、Schema 等
│ └── Serialization/ # XML 序列化/反序列化
│ └── ApiDocumentSerializer.cs
├── AspNetCore.OpenApi.Xml/ # ASP.NET Core 集成
│ ├── Services/ # 核心服务
│ │ ├── ApiXmlDocumentGenerator.cs # 文档生成器
│ │ └── ApiDocumentationPageService.cs # HTML 页面服务
│ └── Extensions/ # DI 和路由扩展
│ ├── ServiceCollectionExtensions.cs
│ └── EndpointRouteBuilderExtensions.cs
└── Demo.WebApi/ # 演示项目
└── Controllers/ # 示例控制器
欢迎贡献!请遵循以下准则:
- 使用 C# 12+ 语法特性(collection expressions, primary constructors, expression-bodied members 等)
- 启用 Nullable Reference Types (
<Nullable>enable</Nullable>) - 遵循现有代码风格和命名约定
- 为公共 API 添加 XML 文档注释
- Fork 本仓库
- 创建功能分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启 Pull Request
在提交 PR 前,请确保:
# 构建成功
dotnet build
# 代码能正常运行
cd Demo.WebApi
dotnet run- 添加单元测试和集成测试
- 支持更多 DataAnnotations 验证规则
- 循环引用检测和 $ref 引用支持
- 支持导出 Markdown 格式文档
- 性能优化(Source Generator 预构建 Schema)
- 支持自定义主题和样式
A: 目前 HTML 页面使用内联样式。未来版本将支持自定义主题。
A: 目前支持 [Required]、[StringLength]、[Range]、[RegularExpression] 等常用 DataAnnotations。
A: 系统支持泛型类型、嵌套泛型、字典等。详见 Demo.WebApi/GENERIC_TESTS.md。
MIT License - 详见 LICENSE 文件