UserManager 退出函数而不抛出任何异常

Posted

技术标签:

【中文标题】UserManager 退出函数而不抛出任何异常【英文标题】:UserManager steps out of the function without throwing any Excepcion 【发布时间】:2021-11-21 21:40:48 【问题描述】:

我正在尝试使用以下代码让我的 MVC 应用在数据库中创建初始预览用户:

private async Task CreateStartupUsers(UserManager<IdentityUser> userManager)
        
            List<IdentityUser> admins = new List<IdentityUser>
            
                new IdentityUser
                
                    UserName = "admin@admin.com",
                    Email = "admin@admin.com",
                    EmailConfirmed = true
                
            ;

...

foreach (var admin in admins)
            
                if (await userManager.FindByNameAsync(admin.UserName) != null)
                
                    continue;
                
                await userManager.CreateAsync(admin, DefaultPassword);
                IdentityUser user = await userManager.FindByNameAsync(admin.UserName);
                await userManager.AddToRoleAsync(user, "Admin");
            

老实说,除了在非异步 public IConfiguration Configuration get; 中调用此函数之外,我在这里没有看到任何问题,但我认为它不能解释这样一个事实,即在调试期间调用 userManager 的指令没有执行并退出函数。

我还制作了一个非常相似的函数来创建初始用户角色,并且效果很好。

private async Task CreateRoles(RoleManager<IdentityRole> roleManager)
        
            var roles = new List<IdentityRole>
            
                new IdentityRole
                
                    Name = "Admin"
                ,
                new IdentityRole
                
                    Name = "Employee"
                ,
                new IdentityRole
                
                    Name = "Customer"
                
            ;

            foreach (var role in roles)
            
                if (await roleManager.RoleExistsAsync(role.Name)) continue;
                var result = await roleManager.CreateAsync(role);
                if (result.Succeeded) continue;

                throw new Exception($"Could not create 'role.Name' role.");
            
        

这些函数在 StartUp.cs 中的 Configure 函数中调用,如下所示:

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env, RoleManager<IdentityRole> roleManager, UserManager<IdentityUser> userManager)
        
            if (env.IsDevelopment())
            
                app.UseDeveloperExceptionPage();
                app.UseMigrationsEndPoint();
                CreateRoles(roleManager);
                CreateStartupUsers(userManager);
            

【问题讨论】:

你能发布你的ConfigureService方法吗? 【参考方案1】:

由于Configuration 方法被同步调用并且它们的子方法异步调用,所以在Configuration 完成之前创建用户的方法没有完成。由于Configuration 必须为构建器返回void,因此我必须进行以下更改:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, RoleManager<IdentityRole> roleManager, UserManager<IdentityUser> userManager)
        
            if (env.IsDevelopment())
            
                app.UseDeveloperExceptionPage();
                app.UseMigrationsEndPoint();
                CreateRolesAndUsersAsync(roleManager, userManager).GetAwaiter().GetResult();
            

GetAwaiter()GetResult() 添加到包含我想要执行的两个异步方法的方法中,我已经确保它们的执行得到了预期的结果。

【讨论】:

以上是关于UserManager 退出函数而不抛出任何异常的主要内容,如果未能解决你的问题,请参考以下文章

如何从子方法中退出方法而不抛出异常

回滚而不抛出异常?

PowerShell:使用参数验证而不抛出异常

IMAPI:如果图像大小超过可用空间,如何获取图像大小而不抛出异常?

H2 不保存价值,不抛出任何异常

如何在运行时检查权限而不抛出 SecurityException?