返回Ok响应时遇AsyncCursor已释放对象异常求助
问题原因
你这段代码的问题出在AsyncCursor的使用逻辑上:当调用users.ToList().Count时,已经将游标枚举完毕并自动释放了资源,后续再调用users.FirstAsync()时,就会访问一个已经被释放的对象,从而触发Cannot access a disposed object异常。
解决方案
有两种简单的修复方式:
方式一:直接获取首个文档(推荐)
不用先判断数量,直接用FirstOrDefaultAsync获取第一个匹配的文档,不存在则返回null,代码更简洁高效:
var user = await _userCollection.Find(user => user.Phone == loginUser.phone).FirstOrDefaultAsync(); if (user != null) { string token = new ShirtDeck.Utils.JwtUtil(configuration).GenerateJWT(user); return Ok(new { user = user, token = token }); } // 此处处理用户不存在的逻辑
方式二:提前将结果存入列表
如果需要先确认是否有匹配数据,可以先把游标结果转成列表保存,后续直接操作这个列表:
var usersList = await _userCollection.FindAsync(user => user.Phone == loginUser.phone).ToListAsync(); if (usersList.Count > 0) { var user = usersList.First(); string token = new ShirtDeck.Utils.JwtUtil(configuration).GenerateJWT(user); return Ok(new { user = user, token = token }); } // 此处处理用户不存在的逻辑
内容的提问来源于stack exchange,提问作者Nandan Wewhare
相关产品推荐
相关产品推荐

