ASP.NET Core 3:无法从根提供程序解析范围服务“Microsoft.AspNetCore.Identity.UserManager`1[Alpha.Models.Identity.User

Posted

技术标签:

【中文标题】ASP.NET Core 3:无法从根提供程序解析范围服务“Microsoft.AspNetCore.Identity.UserManager`1[Alpha.Models.Identity.User]”【英文标题】:ASP.NET Core 3: Cannot resolve scoped service 'Microsoft.AspNetCore.Identity.UserManager`1[Alpha.Models.Identity.User]' from root provider 【发布时间】:2020-02-22 18:33:13 【问题描述】:

当我运行项目时,我遇到了这个问题: (我用过asp.net core 3。)

无法从根提供商解析范围服务“Microsoft.AspNetCore.Identity.UserManager`1[Alpha.Models.Identity.User]”。

我该如何解决这个问题?

ApplicationDbContext 类:

public class ApplicationDbContext : IdentityDbContext<User, Role, int, 
UserClaim, UserRole, UserLogin, RoleClaim, UserToken>

    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
    

    
public static async Task CreateAdminAccount(IServiceProvider 
serviceProvider, IConfiguration configuration)
    
        UserManager<User> userManager = 
serviceProvider.GetRequiredService<UserManager<User>>();
        RoleManager<Role> roleManager = 
serviceProvider.GetRequiredService<RoleManager<Role>>();

        string userName = configuration["Data:AdminUser:Name"];
        string email = configuration["Data:AdminUser:Email"];
        string password = configuration["Data:AdminUser:Password"];
        string role = configuration["Data:AdminUser:Role"];

        if (await userManager.FindByNameAsync(userName) == null)
        
            if (await roleManager.FindByNameAsync(role) == null)
            
                await roleManager.CreateAsync(new Role(role));
            

            User user = new User
            
                Email = email,
                UserName = userName
            ;
            var result = userManager.CreateAsync(user, password);
            if (result.IsCompletedSuccessfully)
            
                await userManager.AddToRoleAsync(user, role);
            
        
    

错误详情:

启动应用程序时出错。聚合异常: 发生一个或多个错误。 (无法解析范围服务 'Microsoft.AspNetCore.Identity.UserManager`1[Alpha.Models.Identity.User]' 来自根提供商。) System.Threading.Tasks.Task.ThrowIfExceptional(bool 包括任务取消异常)

InvalidOperationException:无法解析范围服务 'Microsoft.AspNetCore.Identity.UserManager`1[Alpha.Models.Identity.User]' 来自根提供商。 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(类型 serviceType, IServiceScope 范围, IServiceScope rootScope)

AggregateException:发生一个或多个错误。 (无法解决 范围服务 'Microsoft.AspNetCore.Identity.UserManager`1[Alpha.Models.Identity.User]' 来自根提供商。) System.Threading.Tasks.Task.ThrowIfExceptional(bool includeTaskCanceledExceptions) System.Threading.Tasks.Task.Wait(int 毫秒超时,CancellationToken 取消令牌) System.Threading.Tasks.Task.Wait() Alpha.Web.App.Startup.Configure(IApplicationBuilder 应用程序, Startup.cs 中的 IWebHostEnvironment env) + ApplicationDbContext.CreateAdminAccount(app.ApplicationServices, 配置).Wait(); System.RuntimeMethodHandle.InvokeMethod(对象 目标,对象 [] 参数,签名 sig,布尔构造函数,布尔 wrapExceptions) System.Reflection.RuntimeMethodInfo.Invoke(object obj, BindingFlags invokeAttr,Binder binder,object[]参数, CultureInfo文化) Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(对象实例, IApplicationBuilder 构建器) Microsoft.AspNetCore.Hosting.ConfigureBuilder+c__DisplayClass4_0.b__0(IApplicationBuilder 建设者) Microsoft.AspNetCore.Hosting.GenericWebHostBuilder+c__DisplayClass13_0.b__2(IApplicationBuilder 应用程序) Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter+c__DisplayClass0_0.g__MiddlewareFilterBuilder|0(IApplicationBuilder 建设者) Microsoft.AspNetCore.Server.IIS.Core.IISServerSetupFilter+c__DisplayClass2_0.b__0(IApplicationBuilder 应用程序) Microsoft.AspNetCore.HostFilteringStartupFilter+c__DisplayClass0_0.b__0(IApplicationBuilder 应用程序) Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken 取消令牌) Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken 取消令牌) Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost 主机,CancellationToken 令牌) Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost 主机,CancellationToken 令牌) Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run(IHost 主机) Alpha.Web.App.Program.Main(string[] args) 在 Program.cs + CreateHostBuilder(args).Build().Run();

显示原始异常详细信息 InvalidOperationException:无法解决 范围服务 'Microsoft.AspNetCore.Identity.UserManager`1[Alpha.Models.Identity.User]' 来自根提供商。 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(类型 serviceType、IServiceScope 范围、IServiceScope 根范围) Microsoft.Extensions.DependencyInjection.ServiceProvider.Microsoft.Extensions.DependencyInjection.ServiceLookup.IServiceProviderEngineCallback.OnResolve(类型 serviceType,IServiceScope 范围) Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(类型 serviceType, ServiceProviderEngineScope serviceProviderEngineScope) Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(类型 服务类型) Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider 提供者,类型 serviceType) Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider 提供者) Alpha.DataAccess.ApplicationDbContext.CreateAdminAccount(IServiceProvider serviceProvider, IConfiguration 配置)中 ApplicationDbContext.cs + UserManager userManager = serviceProvider.GetRequiredService>();

显示原始异常详细信息 System.InvalidOperationException: 不能 解析范围服务 'Microsoft.AspNetCore.Identity.UserManager`1[Alpha.Models.Identity.User]' 来自根提供商。在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(类型 serviceType、IServiceScope 范围、IServiceScope rootScope) 在 Microsoft.Extensions.DependencyInjection.ServiceProvider.Microsoft.Extensions.DependencyInjection.ServiceLookup.IServiceProviderEngineCallback.OnResolve(类型 serviceType,IServiceScope 范围)在 Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(类型 serviceType, ServiceProviderEngineScope serviceProviderEngineScope) 在 Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(类型 服务类型)在 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider 提供者,类型 serviceType) 在 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider 提供者)在 Alpha.DataAccess.ApplicationDbContext.CreateAdminAccount(IServiceProvider serviceProvider, IConfiguration 配置)中 E:\Archives\Projects\Alpha\Alpha.DataAccess\ApplicationDbContext.cs:line 92 .NET Core 3.0.0 X64 v4.0.0.0 | Microsoft.AspNetCore.Hosting 版本 3.0.0-rc2.19465.2 |微软视窗 10.0.17763 | 需要帮助吗?

【问题讨论】:

您是否按照docs中的步骤注册了Authentication服务? 【参考方案1】:

从您包含的屏幕截图中,它表明您在Startup.Configure 中有以下行:

ApplicationDbContext.CreateAdminAccount(app.ApplicationServices, Configuration)
    .Wait();

存储在IApplicationBuilder.ApplicationServices 中的IServiceProvider 实例是您的应用程序的root 服务提供者。错误消息指出它无法从 root 服务提供者解析 scoped 服务。

这个问题经常出现,但最简单的解决方案是将IServiceProvider 注入Configure 方法并将其传递给CreateAdminAccount

public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider)

    ApplicationDbContext.CreateAdminAccount(serviceProvider, Configuration)
        .Wait();

传入ConfigureIServiceProvider 实例是作用域,这意味着您可以使用它来创建作用域服务。

这就是完成这项工作所需的全部内容,但在Program 中进行这种类型的播种更为典型。这使播种问题与配置管道分开,并且还允许使用async/await。这是一个例子:

public class Program

    public static async Task Main(string[] args)
    
        var host = CreateHostBuilder(args).Build();

        using (var scope = host.Services.CreateScope())
        
            var serviceProvider = scope.ServiceProvider;
            var config = serviceProvider.GetRequiredService<IConfiguration>();

            await ApplicationDbContext.CreateAdminAccount(serviceProvider, config);
        

        await host.RunAsync();
    

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        // ...

您也可以在Main 中解析UserManager&lt;User&gt;RoleManager&lt;Role&gt;,并将它们传递给CreateAdminAccount,而不是使用服务定位器方法。

【讨论】:

以上是关于ASP.NET Core 3:无法从根提供程序解析范围服务“Microsoft.AspNetCore.Identity.UserManager`1[Alpha.Models.Identity.User的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core Web API InvalidOperationException:无法解析服务 [重复]

如何正确解析要在 ASP.NET Core 3.1 的 ConfigureServices() 中使用的服务?

ASP.NET Core Web API:尝试激活时无法解析服务类型

ASP.NET Core 2 无法解析 Microsoft EntityFrameworkCore DbContext 类型的服务

Wcf 服务在 .NET Core 3.1 控制台应用程序中工作,但在 ASP.NET Core 3.1 Web API 中无法工作

ASP.NET Core 依赖注入错误:尝试激活时无法解析服务类型 - 调用视图组件时出现错误 [重复]