在登录后获得Membership.GetAllUsers()的例外:"项目已被添加"

EmK*_*Kay 5 asp.net asp.net-membership

我有两个共享会员提供商的网站.其中一个是ASP Playground站点,另一个是安装了ASP Playground站点集成包的站点.我们称他们为ASPPG网站和SIP网站.

我在SIP站点上运行Membership.GetAllUsers()时有时会出错.SIP拒绝此方法,因此它不是标准的ASP.NET版本.

它有时只会发生.我注意到只有在其中一个成员发生某种变化时才会发生这种情况.然后它必须重新创建在调用Membership.GetAllUsers()时存储所有用户的哈希表,这就像这种娱乐在某种程度上出错了.

除了我粘贴在"administratoren"下面的例外,登录的用户名已经改变了一些信息.

通过更新web.config强制网站卸载没有帮助.它无助于重新启动IIS或完全重新启动服务器.异常出现后,每次调用Membership.GetAllUsers()时都会一直显示.突然之间,异常消失,并且再次可以登录并运行Membership.GetAllUsers(),没有任何异常.它几乎看起来像错误在数据库中,并且修复错误的方法是加载ASPPG站点的任何页面.然后错误在SIP站点上得到修复.

导致异常的原因是什么?如何阻止它?

完整的例外是这样的:

'/'应用程序中的服务器错误.
项目已添加.密钥字典:'administratoren'密钥被添加:'administratoren'描述:在执行当前Web请求期间发生了未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.

异常详细信息:System.ArgumentException:已添加项.键入字典:'administratoren'键添加:'administratoren'

来源错误:

Linje 116:MembershipUserCollection allUsers;
Linje 117:lock(objLock){
Linje 118:allUsers = Membership.GetAllUsers();
Linje 119:}
Linje 120:

源文件:[WebsiteLocation]\App_Code\MemberInfo.cs行:118

堆栈跟踪:(请注意,此堆栈跟踪中的MemberInfo.cs的行号可能有点偏.

[ArgumentException:Item已被添加.键入字典:'administratoren'键被添加:'administratoren']
System.Collections.Hashtable.Insert(Object key,Object nvalue,Boolean add)+7484392
System.Collections.Hashtable.Add(Object key,Object value)+11
System.Web.Security.MembershipUserCollection.Add(MembershipUser用户)+129
H:\ My Document\Visual Studio 2008\Projects\forumu\MembershipProviders\ASPPGSqlMembershipProvider.vb中的ASPPG.MembershipProviders.ASPPGSqlMembershipProvider.CreateMembershipUserCollectionFromDataView(DataView dv):656 ASPPG.MembershipProviders.ASPPGSqlMembershipProvider.GetAllUsers(Int32 pageIndex,Int32 pageSize,Int32&totalRecords)在H:\ My Document\Visual Studio 2008\Projects\forumu\MembershipProviders\ASPPGSqlMembershipProvider.vb:360 System.Web.Security.Membership.GetAllUsers(Int32 pageIndex,Int32 pageSize,Int32&totalRecords)+65 System.Web.Security.Membership .GetAllUsers()+ 26在D:\ Faelles\SVN-exports\DFF-umbraco\App_Code\MemberInfo.cs中的MemberInfo.GetAllMembers():d:\ Faelles\SVN-exports\DFF-umbraco中的71 usercontrols_GetMemberTopList.LoadTopMembers() \用户控件\ GetMemberTopList.ascx.cs:16中的usercontrols_GetMemberTopList.Page_Load(Object sender,EventArgs e)在d:\ Faelles\SVN-exports\DFF-umbraco\usercontrols\GetMemberTopList.ascx.cs:11 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp,Object o,对象t,EventArgs e)+14 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender,EventArgs e)+35 System.Web.UI.Control.OnLoad(EventArgs e)+99 System.Web.UI.Control.LoadRecursive ()+50 System.Web.UI.Control.LoadRecursive()+ 141 System.Web.UI.Control.LoadRecursive()+ 141 System.Web.UI.Control.LoadRecursive()+ 141 System.Web.UI.Control .LoadRecursive()+ 141 System.Web.UI.Control.LoadRecursive()+ 141 System.Web.UI.Control.LoadRecursive()+ 141 System.Web.UI.Control.LoadRecursive()+ 141 System.Web.UI .Control.LoadRecursive()+ 141 System.Web.UI.Control.LoadRecursive()+ 141 System.Web.UI.Control.LoadRecursive()+ 141 System.Web.UI.Control.LoadRecursive()+ 141 System.Web.UI.Control.LoadRecursive()+ 141 System.Web.UI. Page.ProcessRequestMain(布尔includeStagesBeforeAsyncPoint,布尔includeStagesAfterAsyncPoint)+627

版本信息:Microsoft .NET Framework版本:2.0.50727.3603; ASP.NET版本:2.0.50727.3618

MemberInfo.cs的内容如下:

public class MemberInfo {

    public string Username { get; set; }
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }
    public string Fullname { get; set; }
    public string AddressPrimary { get; set; }
    public string AddressSecondary { get; set; }
    public string Zip { get; set; }
    public string Country { get; set; }
    public string HomepageUrl { get; set; }
    public string Id { get; set; }
    public string MemberNo { get; set; }
    public Boolean IsApproved { get; set; }
    public string Email { get; set; }
    public Boolean IsNotMember { get; set; }
    public Boolean IsUpdated { get; set; }
    public Boolean HasReceivedWelcomeMail { get; set; }
    public int RandomNumber { get; set; }
    public int MemberType { get; set; }

    public MemberInfo() { 

    }

    public MemberInfo(string _username, string _id) {
        Username = _username;

        MembershipUser userRequested = Membership.GetUser(Username);

        ProfileBase profile = ProfileBase.Create(Username);

        IsApproved = userRequested.IsApproved;

        FirstName = profile.GetPropertyValue("Firstname").ToString();
        MiddleName = profile.GetPropertyValue("Middlename").ToString();
        LastName = profile.GetPropertyValue("Lastname").ToString();
        AddressPrimary = profile.GetPropertyValue("AddressPrimary").ToString();
        AddressSecondary = profile.GetPropertyValue("AddressSecondary").ToString();
        Zip = profile.GetPropertyValue("Zip").ToString();
        Country = profile.GetPropertyValue("Country").ToString();
        HomepageUrl = profile.GetPropertyValue("HomepageUrl").ToString();
        HasReceivedWelcomeMail = Boolean.Parse(profile.GetPropertyValue("WelcomeMailSent").ToString());

        if (FirstName.Length > 2) {
            string strFullName = FirstName + " " + MiddleName + " " + LastName;
            Fullname = strFullName.Replace("  ", " ");
        }
        else {
            Fullname = Username;
        }

        MemberNo = profile.GetPropertyValue("MemberNo").ToString();
        IsNotMember = Boolean.Parse(profile.GetPropertyValue("NotMember").ToString());
        Email = userRequested.Email;
        Id = _id;

        if (profile.GetPropertyValue("Description").ToString() != "") {
            IsUpdated = true;
        }
        else {

            if (umbraco.library.GetXmlNodeById("1352").Current.SelectSingleNode("node [@nodeName='" + Username + "']/node") == null) {
                IsUpdated = false;
            }
            else {
                IsUpdated = true;
            }

        }
        RandomNumber = ss.NumberStuff.GenerateRandomNumber(0, 10000000);

        MemberType = 1;

        if (IsApproved == false && HasReceivedWelcomeMail == false) { // Not yet approved
            MemberType = 1;
        }

        if (IsApproved == false && HasReceivedWelcomeMail == true) { // Deleted
            MemberType = 2;
        }

        if (IsApproved == true && IsNotMember == false) { // Members
            MemberType = 3;
        }

        if (IsApproved == true && IsNotMember == true) { // Administrators
            MemberType = 4;
        }

    }

    private static object objLock = new object();

    public List<MemberInfo> GetAllMembers() {
        return GetAllMembers(false);
    }

    public List<MemberInfo> GetAllMembers(Boolean bIncludeAdministrators) {

        MembershipUserCollection allUsers;
        lock (objLock) {
            allUsers = Membership.GetAllUsers();
        }

        List<MemberInfo> memberInfoList = new List<MemberInfo>();

        foreach (MembershipUser userCurrent in allUsers) {
            MemberInfo mInfo = new MemberInfo(userCurrent.UserName, userCurrent.ProviderUserKey.ToString());
            if (mInfo.Id == "0") {
                continue;
            }

            if (mInfo.IsNotMember == true && bIncludeAdministrators == false) {
                continue;
            }

            memberInfoList.Add(mInfo);
        }

        return memberInfoList;

    }

    public static String GetMemberTypeName(int intMemberType) {

        switch (intMemberType) {

            case 1: {
                return "Endnu ikke godkendt";
            }

            case 2: {
                return "Slettet";
            }

            case 3: {
                return "Medlem";
            }

            case 4: {
                return "Administrator";
            }

            default: {
                return "";
            }
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

提前致谢 :)

编辑:添加了MemberInfo.cs的新来源并更新了我收到的错误消息.请注意,堆栈跟踪仍然是旧的,因此它所指的行号可能有点偏差.

编辑:有关错误的大量信息已更改.添加了新的MemberInfo.cs.从登录方法中删除了代码,因为我现在知道这不是错误的原因.

EmK*_*Kay 1

事实证明,该站点将一些会话数据存储在表中。
在某些情况下,该表会过时,然后网站就会崩溃。
我添加了一些清理代码,以便在发生错误时清理表。

感谢所有试图帮助我的人:)