【问题标题】:Cannot access a disposed context instance无法访问已释放的上下文实例
【发布时间】:2021-03-29 01:31:27
【问题描述】:

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

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

无法访问已释放的上下文实例。造成这种情况的一个常见原因 错误正在处理已解决的上下文实例 依赖注入,然后尝试使用相同的上下文 在您的应用程序的其他地方实例。如果您是 在上下文实例上调用“Dispose”,或将其包装在 using 陈述。如果你使用依赖注入,你应该让 依赖注入容器负责处理上下文 实例。对象名称:'MembershipDBContext'。

在下面找到我的代码

Startup.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);
        }

MembershipDBContext.cs

    public class MembershipDBContext : IdentityDbContext<MembershipUser,MembershipRole,string>
    {
        public MembershipDBContext(DbContextOptions<MembershipDBContext> options) : base(options)
        {
        }
    }

管理控制器

 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();
        }

      
    }

AdministrationApiController

[HttpPost]
        public void Post([FromBody] MembershipRole role)
        {
            _adminMSService.AddRoles(role);
        }

管理存储库

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;
            }
        }

    }

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

【问题讨论】:

  • 您在哪一行代码中得到错误?我看不出这段代码中哪里会出现这个问题。
  • 在此特定行上出现异常:IdentityResult result = await _roleManager.CreateAsync(rvm);
  • 这很令人困惑,因为你有存储库和服务,而且你没有把它们都展示出来。首先要检查 - 你是 awaiting all 的异步方法吗?因为我在AdministrationApiController 操作中看到,你没有在那儿做。

标签: c# microservices asp.net-core-webapi asp.net-core-3.1 asp.net-core-identity


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2022-10-13
    • 2021-06-29
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-20
    • 1970-01-01
    相关资源
    最近更新 更多