You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动