Asp.net Identity Core中出现ObjectDisposedException错误求助
解决Asp.net Identity Core里的System.ObjectDisposedException问题
兄弟,我一眼就瞅出问题根源了——你的EmployeeController里的Create方法用了async void作为返回类型,这可是Asp.Net Core异步控制器方法的致命坑!
为啥会触发这个错误?
当控制器方法标记为async void时,Asp.Net Core的请求管道会误以为这个方法已经执行完毕,直接就把当前请求范围内的服务(包括ApplicationDbContext,以及UserManager依赖的上下文实例)给释放了。但此时await userManager.CreateAsync(...)的异步操作还在后台运行,等它尝试访问已经被回收的DbContext时,自然就抛出System.ObjectDisposedException了。
解决方案:把async void改成async Task
直接修改Create方法的返回类型,从async void换成async Task(如果需要给前端返回创建状态,就用async Task<IActionResult>):
[HttpPost("Create")] public async Task Create([FromBody]string employee) { var user = new Employee { UserName = "test@gmail.com", Email = "test@gmail.com" }; var d = await userManager.CreateAsync(user, "1234567"); }
要是想给前端返回更友好的创建结果,可以进一步优化:
[HttpPost("Create")] public async Task<IActionResult> Create([FromBody]string employee) { var user = new Employee { UserName = "test@gmail.com", Email = "test@gmail.com" }; var result = await userManager.CreateAsync(user, "1234567"); if (result.Succeeded) { return Ok("用户创建成功"); } return BadRequest(result.Errors); }
额外注意事项
- 你的
ApplicationDbContext注册方式是正确的(默认AddDbContext就是请求范围生命周期),不要改成单例或其他生命周期类型 - 千万别手动调用DbContext的
Dispose()方法,也不要用using包裹从依赖注入获取的DbContext实例,让DI容器负责管理它的生命周期
这么修改后,Asp.Net Core会等待异步操作完成后再释放相关服务,那个已释放对象的错误就彻底消失啦。
内容的提问来源于stack exchange,提问作者chobo2




