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

.NET 7:如何不依赖app.UseEndpoints()使用IApiDescriptionGroupCollectionProvider

.NET 7中UseEndpoints的内在机制及无UseEndpoints使用IApiDescriptionGroupCollectionProvider的方案

一、UseEndpoints的内在机制

UseEndpoints的核心作用不只是注册端点,它还完成了API描述的即时生成与填充:

  • 调用UseEndpoints时,内部会创建EndpointRouteBuilder实例,在你通过endpoints.MapXXX完成端点注册后,它会主动触发IApiDescriptionProvider相关逻辑,扫描已注册端点并生成对应的ApiDescription对象。
  • 生成的ApiDescription会被整理到IApiDescriptionGroupCollectionProvider的集合中,所以UseEndpoints调用结束后立刻获取该服务,能拿到完整的API描述数据。

而直接使用WebApplication.MapGet等方法时,端点仅被添加到应用的EndpointDataSource中,但API描述生成是延迟执行的——默认要等到应用启动流程后期(比如中间件管道构建完成后)才触发,因此在端点注册后立刻调用IApiDescriptionGroupCollectionProvider,数据还未生成,自然返回空集合,进而导致Swagger无法识别API操作。

二、不使用UseEndpoints的解决方案

1. 延迟获取时机

不要在Program.cs的端点注册完成后立刻获取IApiDescriptionGroupCollectionProvider,将获取逻辑放到应用启动后的回调、控制器方法或自定义中间件中:

var app = builder.Build();

// 注册端点
app.MapGet("/hello", () => "Hello world!");

// 应用启动完成后执行获取逻辑
app.Lifetime.ApplicationStarted.Register(() =>
{
    var apiDescriptions = app.Services.GetRequiredService<IApiDescriptionGroupCollectionProvider>()
        .ApiDescriptionGroups.Items.ToList();
    // 处理API描述数据
});

app.Run();

2. 手动触发API描述生成

如果必须在Program.cs中端点注册后立刻获取,可以手动触发API描述生成流程:

var app = builder.Build();

// 注册端点
app.MapGet("/hello", () => "Hello world!");

// 手动触发API描述生成
var apiDescriptionProvider = app.Services.GetRequiredService<IApiDescriptionProvider>();
var dataSources = app.Services.GetRequiredService<IEnumerable<EndpointDataSource>>();
var context = new ApiDescriptionProviderContext(dataSources.ToList());

apiDescriptionProvider.OnProvidersExecuting(context);
apiDescriptionProvider.OnProvidersExecuted(context);

// 此时可获取完整的API描述
var apiDescriptions = app.Services.GetRequiredService<IApiDescriptionGroupCollectionProvider>()
    .ApiDescriptionGroups.Items.ToList();

app.Run();

3. 调整Swagger中间件顺序

针对Swagger无法识别操作的问题,需保证UseSwagger和UseSwaggerUI中间件在所有端点注册完成后添加——Swagger会在初始化时读取IApiDescriptionGroupCollectionProvider的数据,顺序正确才能拿到已生成的API描述。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 11:45:33