c# - Microsoft Identity Framework 将角色分配给 Postgres 数据库的用户错误 - 已处理 CancellationTokenSource
问题描述
嗨,我在使用 Identity Framework 5.0.5、.net5.0.5 和 Postgres SQL db 为用户分配角色时遇到问题。
用于将角色分配给用户的代码如下所示,其下方有错误。
如果可能,请提供帮助。
非常感谢!
{
if (!await roleManager.RoleExistsAsync("Admin"))
{
await roleManager.CreateAsync(new IdentityRole
{
Name = "Admin"
});
}
ApplicationUser user = await userManager.FindByIdAsync(userId);
if (isAdmin)
{
await userManager.AddToRoleAsync(user, "Admin");
}
else
{
await userManager.RemoveFromRoleAsync(user, "Admin");
}
}
}
services.AddDbContext<ApplicationDbContext>(options =>
options.UseNpgsql(
Configuration.GetConnectionString("DefaultConnection"),
builder => builder.EnableRetryOnFailure(50, TimeSpan.FromSeconds(5), null)));
System.ObjectDisposedException: The CancellationTokenSource has been disposed.
at System.Threading.CancellationTokenSource.ThrowObjectDisposedException()
at System.Threading.CancellationTokenSource.CancelAfter(Int32 millisecondsDelay)
at System.Threading.CancellationTokenSource.CancelAfter(TimeSpan delay)
at Npgsql.Util.ResettableCancellationTokenSource.Stop()
at Npgsql.NpgsqlReadBuffer.<Ensure>g__EnsureLong|40_0(NpgsqlReadBuffer buffer, Int32 count, Boolean async, Boolean readingNotifications)
at Npgsql.NpgsqlConnector.<ReadMessage>g__ReadMessageLong|194_0(NpgsqlConnector connector, Boolean async, DataRowLoadingMode dataRowLoadingMode, Boolean readingNotifications, Boolean isReadingPrependedMessage)
at Npgsql.NpgsqlDataReader.NextResult(Boolean async, Boolean isConsuming, CancellationToken cancellationToken)
at Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior behavior, Boolean async, CancellationToken cancellationToken)
at Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior behavior, Boolean async, CancellationToken cancellationToken)
at Npgsql.NpgsqlCommand.ExecuteDbDataReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.AsyncEnumerator.InitializeReaderAsync(DbContext _, Boolean result, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Storage.ExecutionStrategy.ExecuteImplementationAsync[TState,TResult](Func`4 operation, Func`4 verifySucceeded, TState state, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Storage.ExecutionStrategy.ExecuteImplementationAsync[TState,TResult](Func`4 operation, Func`4 verifySucceeded, TState state, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.AsyncEnumerator.MoveNextAsync()
at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.SingleOrDefaultAsync[TSource](IAsyncEnumerable`1 asyncEnumerable, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.SingleOrDefaultAsync[TSource](IAsyncEnumerable`1 asyncEnumerable, CancellationToken cancellationToken)
at SearchDataScreening.Pages.UserManagement.OnGetAdminControl(String userId, Boolean isAdmin) in /Users/dewaldthattingh/GitHubRepos/TPS/SearchScreening/SearchDataScreening/Pages/UserManagement.cshtml.cs:line 50
at System.Threading.Tasks.Task.<>c.<ThrowAsync>b__140_1(Object state)
at System.Threading.QueueUserWorkItemCallback.<>c.<.cctor>b__6_0(QueueUserWorkItemCallback quwi)
at System.Threading.ExecutionContext.RunForThreadPoolUnsafe[TState](ExecutionContext executionContext, Action`1 callback, TState& state)
at System.Threading.QueueUserWorkItemCallback.Execute()
at System.Threading.ThreadPoolWorkQueue.Dispatch()
at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
解决方案
请尝试将其更改为不使用下面的等待方法
bool roleExist = roleManager.RoleExistsAsync("Admin").Result;
if (!roleExist)
{
var x = roleManager.CreateAsync(new IdentityRole
{
Name = "Admin"
}).Result;
}
if (isAdmin)
{
var user = userManager.FindByIdAsync(userId).Result;
if (user != null)
{
var x = userManager.AddToRoleAsync(user, "Admin").Result;
}
}
else
{
var user = userManager.FindByIdAsync(userId).Result;
if (user != null)
{
var x = userManager.RemoveFromRoleAsync(user, "Admin").Result;
}
}
推荐阅读
- c# - HttpContext.Current.User 返回 system.security.claims.windowsprincipal 而不是 system.security.claims.ClaimPrincipal
- php - PHP变量名连接不起作用
- php - 注册 SOAP Web 服务时如何设置 Header?
- android - 后台扫描iOS设备发送的Ble包
- java - 取消选中复选框
- browser - 浏览器代码执行的可能方法
- angular - angular7输入类型文件上传不起作用
- reactjs - 如何使用 React Redux 在 Reducer ADD_TO_CART 中添加产品项目的数量
- javascript - 想要在模态/弹出正文中添加十字图标或关闭按钮以关闭模态
- automated-tests - 如何在 testcafe 中减小鼠标指针的大小