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

ASP.NET Core 9 Web API模板项目启动报错:无法解析IOptionsSnapshot服务

解决ASP.NET Core 9 Web API模板项目启动时的IOptionsSnapshot解析错误

问题重现

使用Visual Studio标准模板创建未修改的ASP.NET Core 9 Web API项目,启动时抛出错误:

System.InvalidOperationException: 'Cannot resolve scoped service 'Microsoft.Extensions.Options.IOptionsSnapshot`1[Microsoft.AspNetCore.OpenApi.OpenApiOptions]' from root provider.'

.NET 8同模板项目可正常运行,项目Program.cs代码如下:

public static void Main(string[] args)
{
    var builder = WebApplication.CreateBuilder(args);

    builder.Services.AddControllers();
    builder.Services.AddOpenApi();

    var app = builder.Build();

    if (app.Environment.IsDevelopment())
    {
        app.MapOpenApi();
    }

    app.UseHttpsRedirection();
    app.UseAuthorization();
    app.MapControllers();

    app.Run();
}

解决方案

方案1:改用Swagger传统注册(推荐)

将AddOpenApi()和MapOpenApi()替换为成熟的Swagger注册方式:

public static void Main(string[] args)
{
    var builder = WebApplication.CreateBuilder(args);

    builder.Services.AddControllers();
    // 替换AddOpenApi为AddSwaggerGen
    builder.Services.AddSwaggerGen();

    var app = builder.Build();

    if (app.Environment.IsDevelopment())
    {
        // 替换MapOpenApi为Swagger中间件
        app.UseSwagger();
        app.UseSwaggerUI();
    }

    app.UseHttpsRedirection();
    app.UseAuthorization();
    app.MapControllers();

    app.Run();
}

方案2:调整OpenApiOptions的服务生命周期

如果需要继续使用AddOpenApi(),可以手动将OpenApiOptions的注册覆盖为Singleton,避免根服务提供者无法解析Scoped服务:

public static void Main(string[] args)
{
    var builder = WebApplication.CreateBuilder(args);

    builder.Services.AddControllers();
    builder.Services.AddOpenApi();
    // 覆盖注册为Singleton,让根容器可以解析
    builder.Services.AddSingleton<IOptions<OpenApiOptions>>(sp =>
        sp.GetRequiredService<IOptionsSnapshot<OpenApiOptions>>());

    var app = builder.Build();

    if (app.Environment.IsDevelopment())
    {
        app.MapOpenApi();
    }

    app.UseHttpsRedirection();
    app.UseAuthorization();
    app.MapControllers();

    app.Run();
}

原因分析

ASP.NET Core 9预览版中,AddOpenApi()默认将OpenApiOptions通过IOptionsSnapshot<T>注册为Scoped生命周期服务。但MapOpenApi()在应用启动阶段执行,此时使用的是根服务提供者(仅能解析Singleton生命周期的服务),尝试获取Scoped的IOptionsSnapshot<OpenApiOptions>就会触发上述错误。而.NET 8的OpenApi相关注册逻辑不存在这个生命周期冲突,因此可以正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 20:46:05