. NET Core Web API项目中,我编写了如下接口。第一个请求是正常的,第二个请求将报告错误。应该是我对异步编程了解不够。我不知道为什么会报告错误。我希望朋友能给我一些建议。
[HttpGet("role_claims")]
public async Task<IActionResult> role_claims()
{
// var user = await userManager.GetUserAsync(User);
// var roles = await userManager.GetRolesAsync(user);
List<Claim> claims = new List<Claim>();
var roles = this.User.FindAll(ClaimTypes.Role).ToList();
roles.ForEach(async x => {
MyRole role = await roleManager.FindByNameAsync(x.Value);
IList<Claim> list = await roleManager.GetClaimsAsync(role);
Console.WriteLine($"{x.ValueType} {x.Value} {list.Count}");
list.ToList().ForEach(x => claims.Add(x));
});
return Ok(claims.Select(claim => new { claim.Type, claim.Value }).ToArray());
}
错误信息如下
失败:Microsoft.EntityFrameworkCore.Query [10100]
在对上下文类型'OnePlan.Conf.IdentityDb'的查询结果进行迭代时发生异常。
系统。ObjectDisposedException:无法访问已处置的上下文实例。造成此错误的一个常见原因是,处理从依赖注入中解决的上下文实例,然后试图在应用程序的其他地方使用相同的上下文实例。如果在上下文实例上调用"Dispose"或将其包装在using语句中,可能会发生这种情况。如果你正在使用依赖注入,你应该让依赖注入容器来处理上下文实例。
对象名称:'IdentityDb'.
at microsoft . entityframeworkcore . dbcontext . checkdispose ()
at Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies()
at microsoft . entityframeworkcore . dbcontext . internal . idbcontextdependencies . get_statemanager ()
at microsoft . entityframeworkcore . querycontextdependencies . get_statemanager ()
at Microsoft.EntityFrameworkCore.Query.QueryContextDependencies.get_StateManager()
at Microsoft.EntityFrameworkCore.Query.QueryContext. querycontext . checkdispose ()
at microsoft . entityframeworkcore . querycontext . checkdispose ()
at microsoft . entityframeworkcore . querycontext . checkdispose ()InitializeStateManager(Boolean standAlone)
at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable1.AsyncEnumerator.InitializeReaderAsync(AsyncEnumerator enumerator, CancellationToken cancellationToken) at Pomelo.EntityFrameworkCore.MySql.Storage.Internal.MySqlExecutionStrategy.ExecuteAsync[TState,TResult](TState state, Func
. 4操作,Func4 verifySucceeded, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable
. 1.AsyncEnumerator.MoveNextAsync()
这么几行代码就有这么多问题。
从EF上调用ToList()
开始。核心(可能?)上下文,你绝对不应该这样做。异步版本负责工作线程之间的任何多线程同步。
那么你正在使用的ForEach
函数不支持async
调用,或者你会等待它。相反,它所做的是什么都不运行,然后返回你的Ok()
结果,然后处置你的上下文,最后实际运行你的代码在ForEach
,方式后的上下文被处置,因此你的问题。
在实体上使用常规的foreach
,或者编写ForEachAsync
扩展函数并在调用中等待它。