【问题标题】:asp.net mvc core A second operation was started on the context before the first operation is completedasp.net mvc core 在第一个操作完成之前对上下文启动了第二个操作
【发布时间】:2018-08-16 04:53:25
【问题描述】:

我正在使用此代码对控制器进行授权。

[Authorize(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;
                        }
                    }
                }
            }
        }

错误发生在上面这一行

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

如何让任务在上述方法中的第二个操作开始之前等待?

【问题讨论】:

    标签: asp.net-mvc asynchronous async-await task


    【解决方案1】:

    您不能使用单例数据库上下文。您可以在每次需要时创建一个,或者您 pool them

    【讨论】:

    • 如果我没有在我的应用程序中对数据库上下文使用依赖注入。我如何每次都创建一个瞬态数据库请求?你能指出一些事情吗
    • 如果注入池,应该没有问题。如果注入上下文,则可以将其更改为注入上下文工厂。这也适用于池化上下文。
    猜你喜欢
    • 2018-11-07
    • 1970-01-01
    • 2020-09-30
    • 2020-11-06
    • 1970-01-01
    • 2022-01-01
    • 2022-09-27
    • 2018-07-23
    • 1970-01-01
    相关资源
    最近更新 更多