Исключение для Membership.GetAllUsers () после входа в систему: «Элемент уже добавлен»

У меня работают два сайта, у которых есть общий провайдер членства. Один из них - это сайт ASP Playground, а другой - сайт, на котором установлен пакет интеграции сайта ASP Playground. Назовем их сайтом ASPPG и сайтом SIP.

Иногда я получаю сообщение об ошибке, когда запускаю Membership.GetAllUsers () на сайте SIP. Этот метод отменяется SIP, поэтому он не является стандартной версией ASP.NET.

Это происходит только иногда. Я заметил, что это происходит только тогда, когда происходит какое-то изменение в одном из участников. Затем он должен воссоздать хэш-таблицу, в которой хранятся все пользователи при вызове Membership.GetAllUsers (), и похоже, что это воссоздание каким-то образом идет не так.

За исключением, которое я вставил ниже, «administratoren» - это имя пользователя для входа в систему, для которого была изменена некоторая информация.

Принудительная выгрузка веб-сайта путем обновления файла web.config не помогает. Не помогает ни перезапуск IIS, ни полная перезагрузка сервера. После появления исключения оно продолжает отображаться каждый раз при вызове Membership.GetAllUsers (). Внезапно, совершенно неожиданно, исключение исчезает, и снова можно войти в систему и запустить Membership.GetAllUsers () без каких-либо исключений. Похоже, что ошибка находится в базе данных, и способ исправить ошибку - загрузить любую страницу сайта ASPPG. Затем ошибка исправляется на сайте SIP.

Что вызывает исключение и как его остановить?

Полное исключение следующее:

Ошибка сервера в приложении '/'.
Товар уже добавлен. Ключ в словаре: «administratoren» Добавляемый ключ: «administratoren» Описание: необработанное исключение произошло во время выполнения текущего веб-запроса. Просмотрите трассировку стека для получения дополнительной информации об ошибке и ее происхождении в коде.

Сведения об исключении: System.ArgumentException: элемент уже добавлен. Ключ в словаре: 'administratoren' Добавляемый ключ: 'administratoren'

Ошибка источника:

Linje 116: MembershipUserCollection allUsers;
Линье 117: блокировка (objLock) {
Линье 118: allUsers = Membership.GetAllUsers ();
Линье 119:}
Linje 120:

Исходный файл: [WebsiteLocation] \ App_Code \ MemberInfo.cs Строка: 118

Трассировка стека: (Обратите внимание, что номера строк MemberInfo.cs в этой трассировке стека могут быть немного неправильными.

[ArgumentException: элемент уже добавлен. Ключ в словаре: 'administratoren' Добавляемый ключ: 'administratoren']
System.Collections.Hashtable.Insert (ключ объекта, n-значение объекта, логическое добавление) +7484392
System.Collections.Hashtable.Add (ключ объекта, значение объекта) +11
System.Web.Security.MembershipUserCollection.Add (пользователь MembershipUser) +129
ASPPG.MembershipProviders.ASPPGSqlMembershipProvider.CreateMembershipUserCollectionFromDataView (DataView dv) в H: \ My Document \ Visual Studio 2008 \ Projects \ forumu \ MembershipProviders \ ASPPGSqlMembershipProvider.vb: 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 MemberInfo.GetAllMembers () в d: \ Faelles \ SVN-exports \ DFF-umbraco \ App_Code \ MemberInfo.cs: 71 usercontrols_GetMemberTopList.LoadTopMembers () в d: \ Faelles \ SVN-exports \ DFF-umbraco \ usercontrols \ GetMemberTopList.ascx.cs: 16 usercontrols_GetMemberTopList.Page_Load (Отправитель объекта, EventArgs e) в d: \ Faelles \ SVN-exports \ DFF-umbraco \ usercontrols \ GetMemberTopList.ascx.cs: 11 System.Web.Util.CalliHelper.EventArgFunctionCaller (IntPtr fp, Object o, Object t, EventArgs e) +14 System.Web.Util.CalliEventHandlerDelegateProxy.Callback (отправитель объекта, 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 "";
            }
        }

    }

}

Заранее спасибо :)

Редактировать: Добавлен новый источник MemberInfo.cs и обновлено, какое сообщение об ошибке я получаю. Обратите внимание, что трассировка стека по-прежнему старая, поэтому номера строк, на которые она ссылается, могут быть немного неправильными.

Изменить: было изменено много информации об ошибке. Добавлен новый MemberInfo.cs. Удален код из метода входа в систему, поскольку теперь я знаю, что это не причина ошибки.

5
задан EmKay 4 November 2010 в 10:29
поделиться