Мое приложение: веб-приложение .Net Core 3.1 с использованием микросервисной архитектуры; Идентификация для авторизации и аутентификации в виде отдельного API микросервиса.
Я расширил стандартную таблицу AspNetUsers и AspNetRoles настраиваемыми полями. Получение следующей ошибки при попытке создать новую роль с помощью Identity RoleManager.
Не удается получить доступ к удаленному экземпляру контекста. Распространенная причина этого ошибка удаляет экземпляр контекста, который был разрешен из внедрение зависимости, а затем попытка использовать тот же контекст экземпляр в другом месте вашего приложения. Это может произойти, если вы вызов 'Dispose' в экземпляре контекста или обертывание его в использование заявление. Если вы используете внедрение зависимостей, вы должны разрешить Контейнер для инъекций зависимостей позаботится об удалении контекста экземпляры. Имя объекта: '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);
}
ЧленствоDBContext.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();
}
}
АдминистрированиеApiController
[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;
}
}
}
Я пытался сделать сервисы и репозитории одноэлементными, но это тоже не сработало. Что мне здесь не хватает? Любые идеи?
получение исключения в этой конкретной строке: IdentityResult result = await _roleManager.CreateAsync(rvm);
Это довольно запутанно, потому что у вас есть репозитории, сервисы повсюду, и вы не показываете их все. Первое, что нужно проверить — используете ли вы все асинхронные методы? Потому что я вижу в экшене await
, что ты там этого не делаешь.
Решил проблему! Как отметил в своем комментарии DavidG, я пропустил ключевое слово «ожидание» в некоторых местах, таких как AdministrationApiController. Публикация здесь как «Ответ», так как я не могу пометить комментарий как «Ответ».
В какой строке кода вы получаете ошибку? Я не вижу, где эта проблема может возникнуть в этом коде.