更新图片时触发Cannot access a disposed object错误,求排查解决
解决ASP.NET Core图片更新操作中的「Cannot access a disposed object」错误
问题根源
Controller的AddImage方法调用Repository异步方法时未使用await关键字,导致异步操作还未完成,Controller就提前返回并结束请求。ASP.NET Core默认将DbContext注册为Scoped生命周期,请求结束后会自动释放DbContext实例,而Repository中后续的异步数据库操作(如FindAsync、SaveChangesAsync)仍在执行,此时访问已被释放的DbContext就会触发该错误。
解决步骤
- 在Controller中调用Repository的异步方法时必须添加
await,确保异步操作完成后再结束请求,避免DbContext被提前释放。 - 遵循C#命名规范,将Repository方法名改为PascalCase格式(如
updateImage改为UpdateImage)。
修改后的代码
Controller代码
[Route("Admin/Image/AddImage")] [HttpPost] public async Task<IActionResult> AddImage([FromForm] IFormFile file, [FromForm] Image image) { if (file != null) { var filename = uploadImages(file); image.url = filename; } if (image.Id == Guid.Empty) { await imgRepo.CreateAsync(image); } else { await imgRepo.UpdateImage(image); } return RedirectToAction("Index"); }
Repository代码
public async Task UpdateImage(Image image) { try { if (image == null) { throw new ArgumentNullException(nameof(image)); } var existingImage = await _dbContext.images.FindAsync(image.Id); if (existingImage != null) { _dbContext.images.Entry(existingImage).CurrentValues.SetValues(image); await _dbContext.SaveChangesAsync(); } else { throw new KeyNotFoundException($"Image with ID {image.Id} not found."); } } catch (Exception ex) { Console.WriteLine($"An error occurred: {ex.Message}"); } }
额外注意事项
- ASP.NET Core中Scoped生命周期的服务(如
DbContext)会在请求结束后自动释放,因此所有依赖该服务的异步操作必须通过await等待完成,不能采用“火并忘记”的调用方式。 - 异步方法的命名应统一以
Async结尾(如CreateAsync、UpdateImageAsync),这是C#的通用编码规范,能提升代码可读性和可维护性。
内容的提问来源于stack exchange,提问作者Ghayoor Balti
相关产品推荐
相关产品推荐

