无法访问已释放的上下文实例

Gra*_*n K 8 c# microservices asp.net-core-webapi asp.net-core-identity asp.net-core-3.1

我的应用程序:使用微服务架构的.Net Core 3.1 Web应用程序;授权和身份验证的身份作为单独的微服务 API。

我使用自定义字段扩展了标准 AspNetUsers 和 AspNetRoles 表。当我尝试使用 Identity RoleManager 创建新角色时出现以下错误。

无法访问已释放的上下文实例。导致此错误的一个常见原因是处置从依赖项注入解析的上下文实例,然后尝试在应用程序的其他位置使用相同的上下文实例。如果您在上下文实例上调用“Dispose”或将其包装在 using 语句中,则可能会发生这种情况。如果您使用依赖项注入,则应该让依赖项注入容器负责处理上下文实例。对象名称:“MembershipDBContext”。

在下面找到我的代码

启动.cs

public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            var idenConnectionString = Configuration["DbContextSettings:IdentityConnectionString"];
            var userConnectionString = Configuration["DbContextSettings:UserConnectionString"];
            var dbPassword = Configuration["DbContextSettings:DbPassword"];
            var builder = new NpgsqlConnectionStringBuilder(idenConnectionString)
            {
                Password = dbPassword
            };
            var userBuilder = new NpgsqlConnectionStringBuilder(userConnectionString)
            {
                Password = dbPassword
            };

            services.AddDbContext<MembershipDBContext>(opts => opts.UseNpgsql(builder.ConnectionString));
            services.AddDbContext<UserDBContext>(opts => opts.UseNpgsql(userBuilder.ConnectionString));

            

            services.AddIdentity<MembershipUser, MembershipRole>(options =>
            {
                options.Password.RequiredLength = 8;
                options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+ ";
                options.SignIn.RequireConfirmedEmail = false;
            }).AddRoles<MembershipRole>().AddEntityFrameworkStores<MembershipDBContext>()
            .AddDefaultTokenProviders();


            services.AddTransient<IIdentityMSService, IdentityMSService>();//IdentityMS
            services.AddTransient<IAdministrationService, AdministrationService>();//IdentityMS

            services.AddTransient<IIdentityMSRepository, IdentityMSRepository>();//IdentityMS
            services.AddTransient<IAdministrationRepository, AdministrationRepository>();//IdentityMS
            services.AddTransient<UserDBContext>();
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
            
            services.AddMediatR(typeof(Startup));
            RegisterServices(services);
        }
Run Code Online (Sandbox Code Playgroud)

MembershipDBContext.cs

    public class MembershipDBContext : IdentityDbContext<MembershipUser,MembershipRole,string>
    {
        public MembershipDBContext(DbContextOptions<MembershipDBContext> options) : base(options)
        {
        }
    }
Run Code Online (Sandbox Code Playgroud)

管理控制器

 public class AdministrationController : Controller
    {
        private readonly IAdministrationMVCService _adminService;

        public AdministrationController(IAdministrationMVCService adminService)
        {
            _adminService = adminService;            
        }

        // GET: AdministrationController/Create
        public ActionResult Create()
        {
            return View();
        }

        // POST: AdministrationController/Create
        [HttpPost]
        //[ValidateAntiForgeryToken]
        public async Task<IActionResult> CreateAsync(MembershipRole rm)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    rm.CompanyId = 1;
                    await _adminService.AddRoles(rm);
                    //return RedirectToAction(nameof(Index));
                    return View();
                }
                catch
                {
                    return View();
                }
            }
            return View();
        }

      
    }
Run Code Online (Sandbox Code Playgroud)

管理API控制器

[HttpPost]
        public void Post([FromBody] MembershipRole role)
        {
            _adminMSService.AddRoles(role);
        }
Run Code Online (Sandbox Code Playgroud)

管理信息库

public class AdministrationRepository : IAdministrationRepository
    {
        private readonly RoleManager<MembershipRole> _roleManager;
        private readonly UserManager<MembershipUser> _userManager;

        public AdministrationRepository(RoleManager<MembershipRole> roleManager, UserManager<MembershipUser> userManager)
        {            
            _roleManager = roleManager;
            _userManager = userManager;
        }

        public async Task AddRolesAsync(MembershipRole rvm)
        {
            try
            {
                IdentityResult result = await _roleManager.CreateAsync(rvm);
                if (result.Succeeded) {

                }
            }
            catch (Exception ex)
            {
                throw;
            }
        }

    }
Run Code Online (Sandbox Code Playgroud)

我尝试将服务和存储库设置为单例,但它也不起作用。我在这里缺少什么?有什么见解吗?

Gra*_*n K 10

解决了问题!正如 DavidG 在他的评论中指出的那样,我在某些地方(例如 AdministrationApiController)错过了“await”关键字。在这里发布为“答案”,因为我无法将评论标记为“答案”。