Asp.net mvc asp.net mvc core在第一个操作完成之前,在上下文上启动了第二个操作
我使用此代码对控制器进行授权 使用Asp.net mvc asp.net mvc core在第一个操作完成之前,在上下文上启动了第二个操作,asp.net-mvc,asynchronous,async-await,task,Asp.net Mvc,Asynchronous,Async Await,Task,我使用此代码对控制器进行授权 使用[授权(Policy=“CustomRole”)] 事情发生了,在3或4次请求之后,它失败了 在上一个操作完成之前,在此上下文上启动了第二个操作 public class CustomRoleRequirement : AuthorizationHandler<CustomRoleRequirement>, IAuthorizationRequirement { public CMSContext _context = new CMSCon
[授权(Policy=“CustomRole”)]
事情发生了,在3或4次请求之后,它失败了
在上一个操作完成之前,在此上下文上启动了第二个操作
public class CustomRoleRequirement : AuthorizationHandler<CustomRoleRequirement>, IAuthorizationRequirement
{
public CMSContext _context = new CMSContext();
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomRoleRequirement requirement)
{
var routeobj = context.Resource as Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext;
var c = routeobj.RouteData.Values.Values.ToList();
var keys = routeobj.RouteData.Values.Keys.ToList();
string area = "";
string id = "";
string controller = "";
string action = "";
string module = "";
foreach (var item in keys)
{
if (item=="area")
{
int indexs = keys.FindIndex(cc => cc == "area");
area = c[indexs].ToString();
}
else if (item == "id")
{
int indexs = keys.FindIndex(cc => cc == "id");
id = c[indexs].ToString();
}
else if (item == "controller")
{
int indexs = keys.FindIndex(cc => cc == "controller");
controller = c[indexs].ToString();
}
else if (item == "module")
{
int indexs = keys.FindIndex(cc => cc == "module");
module = c[indexs].ToString();
}
else if (item == "action")
{
int indexs = keys.FindIndex(cc => cc == "action");
action = c[indexs].ToString();
}
}
string modulelink = controller;
if (!string.IsNullOrEmpty(module))
{
modulelink = modulelink + "/" + module;
}
List<string> Roles = new List<string>();
int UserId = Auth.UserID;
string UserName = Auth.UserName;
if (UserName == "superadmin")
{
context.Succeed(requirement);
return Task.CompletedTask;
}
else
{
// apparently the error occurred here
var moduleobj = _context.AppModules.FirstOrDefault(q => q.Link == modulelink);
if (moduleobj != null)
{ // 69 role is assessing news module
//60 role is accessing page module
var RolesModulesobj = _context.AppRolesModules.FirstOrDefault(q => q.ModuleId == moduleobj.ModuleId && q.RolesId == Auth.RoleId);
if (RolesModulesobj != null)
{
string permissionsobj = RolesModulesobj.Permissions;
List<string> PermissionsListobj = permissionsobj.Split(',').Select(x => x.Trim()).ToList();
var FindFullAccess = PermissionsListobj.FirstOrDefault(q => q.Contains("FullAccess:true"));
if (FindFullAccess != null)
{
context.Succeed(requirement);
return Task.CompletedTask;
}
else
{
var abc = PermissionsListobj.FirstOrDefault(q => q.Contains(action + ":true"));
if (abc != null)
{
context.Succeed(requirement);
return Task.CompletedTask;
}
else
{
context.Fail();
return Task.CompletedTask;
}
}
}
}
}
如何使任务在上述方法中启动第二个操作之前等待?不能使用单例数据库上下文。如果我没有在我的应用程序中使用db上下文的依赖项注入,您可以在每次需要时创建一个。如何每次都创建一个瞬态db请求?你能指出一些事情吗?如果你注入池,你应该没有问题。如果注入上下文,可以将其更改为注入上下文工厂。这也适用于池上下文。
var moduleobj = _context.AppModules.FirstOrDefault(q => q.Link == modulelink);