C# ASP.Net角色-RemoveUserFromRole-删除角色时出错

C# ASP.Net角色-RemoveUserFromRole-删除角色时出错,c#,asp.net,.net,roles,C#,Asp.net,.net,Roles,给出这段代码。。。(role和userName是传入的字符串) 我得到以下错误: 用户“xxx”已不是角色“yyy” 这有点神秘,因为我刚刚获取了用户的角色,并检查了要删除的角色是否存在。。。。有什么线索可以让它正常工作吗?这难道不是一个多线程问题吗?你有没有试过用锁块把代码围起来?如果在foreach循环中使用Roles.IsUserInRole(用户名,角色)检查角色是否存在,会发生什么 我会尝试用这样的代码调试它,看看会发生什么 string[] existingRoles

给出这段代码。。。(
role
userName
是传入的字符串)

我得到以下错误:

用户“xxx”已不是角色“yyy”


这有点神秘,因为我刚刚获取了用户的角色,并检查了要删除的角色是否存在。。。。有什么线索可以让它正常工作吗?

这难道不是一个多线程问题吗?你有没有试过用锁块把代码围起来?如果在foreach循环中使用Roles.IsUserInRole(用户名,角色)检查角色是否存在,会发生什么

我会尝试用这样的代码调试它,看看会发生什么

        string[] existingRoles = Roles.GetRolesForUser(userName);

        foreach (string role in existingRoles)
        {
            if (!newRoles.Contains(role))
            {
                Authentication.AuthTraceStatic("Removing user {0} from role: {1}", userName, role);
                lock(o)
                {
                     if(Roles.IsUserInRole(userName, role))
                          Roles.RemoveUserFromRole(userName, role);
                     else
                         Authentication.AuthTraceStatic("Somebody is messing with my roles!!", userName, role);
                }

            }
        }

首先检查用户名的上下文。我自己也有同样的问题。有时用户名返回的是当前登录的用户,而不是您试图删除其角色的用户

其次,检查以确保您的代码没有删除您不希望删除的角色。这是我犯同样错误时遇到的两个问题。还要确保您正在使用成员资格提供程序获取成员资格用户对象,然后您可以使用该对象访问用户名

这是我的类似代码,但我循环浏览了一个复选框列表,其中的角色已经绑定并预先填充了用户已经拥有的选定角色

MembershipUser=Membership.GetUser(txtUserName.Text)


希望这有帮助。GS

答案是,在dbo.aspnet_Roles表中有两个条目用于该角色,相同的RoleName和不同的loweredrolename,这似乎导致删除代码失败。

好的,它适用于大多数角色-我发现一个有问题的角色是一个已重命名(通过SQL)的角色。根据您的建议,我现在已经得到了“无声失败”-Roles.RemoveUserFromRole不会失败-但角色也不会被删除…确保您没有使用Roles.IsUserInRole(“[rolename]”);您应该使用Roles.IsUserInRole(“[username]”,“[rolename]”);
        string[] existingRoles = Roles.GetRolesForUser(userName);

        foreach (string role in existingRoles)
        {
            if (!newRoles.Contains(role))
            {
                Authentication.AuthTraceStatic("Removing user {0} from role: {1}", userName, role);
                lock(o)
                {
                     if(Roles.IsUserInRole(userName, role))
                          Roles.RemoveUserFromRole(userName, role);
                     else
                         Authentication.AuthTraceStatic("Somebody is messing with my roles!!", userName, role);
                }

            }
        }
            //Update roles
            foreach (ListItem role in cbRoles.Items)
            {
                if (role.Selected)
                {
                    //if user is not in role
                    if (!Roles.IsUserInRole(user.UserName,role.Value))
                    {
                        Roles.AddUserToRole(user.UserName, role.Value);
                    }
                }//role not selected
                else
                {
                    //if user is in a role that is no longer selected remove them
                    if (Roles.IsUserInRole(user.UserName, role.Value))
                    {
                        Roles.RemoveUserFromRole(user.UserName, role.Value);
                    }
                }
            }