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
相关产品推荐
相关产品推荐

