maztt
maztt

Reputation: 12294

asp.net mvc core A second operation was started on the context before the first operation is completed

I am using this code for authorization on controllers.

with [Authorize(Policy = "CustomRole")]

The thing happened that after 3 or 4 request it fails with

A second operation started on this context before a previous operation completed

 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;
                        }
                    }
                }
            }
        }

The error occurred at this line above

 var moduleobj = _context.AppModules.FirstOrDefault(q => q.Link == modulelink);

How can I make task wait before the second operation started in the method above?

Upvotes: 0

Views: 92

Answers (1)

Paulo Morgado
Paulo Morgado

Reputation: 14846

You can't use a singleton DB context. You either create one each time you need one or you pool them.

Upvotes: 1

Related Questions