Tengo dos sitios en ejecución que comparten un proveedor de membresía. Uno de ellos es un sitio ASP Playground y el otro es un sitio que tiene instalado el Paquete de Integración del Sitio ASP Playground. Vamos a llamarlos sitio ASPPG y sitio SIP.Excepción en Membership.GetAllUsers() después de iniciar sesión: "El elemento ya se ha agregado"
A veces recibo un error cuando ejecuto Membership.GetAllUsers() en el sitio SIP. Este método es invalidado por el SIP, por lo que no es la versión estándar de ASP.NET.
A veces ocurre solo. Me di cuenta de que solo ocurre cuando hay algún tipo de cambio en uno de los miembros. Luego debe volver a crear la tabla hash en la que están almacenados todos los usuarios al llamar a Membership.GetAllUsers() y es como si la recreación no funcionara de alguna manera.
En la excepción que he pegado a continuación, "administratoren" es el nombre de usuario del inicio de sesión que ha tenido alguna información modificada.
No ayuda a forzar la descarga del sitio web actualizando el archivo web.config. No ayuda reiniciar el IIS o reiniciar completamente el servidor. Después de que aparezca la excepción, sigue apareciendo cada vez que se llama Membership.GetAllUsers(). De repente, de la nada, la excepción desaparece y de nuevo es posible iniciar sesión y ejecutar Membership.GetAllUsers() sin excepciones. Parece que el error está en la base de datos y una forma de corregir el error es cargar cualquier página del sitio ASPPG. Luego, el error se soluciona en el sitio SIP.
¿Qué causa la excepción y cómo la detengo?
La excepción completa es la siguiente:
Server Error in '/' Application.
Item has already been added. Key in dictionary: 'administratoren' Key being added: 'administratoren' Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.Exception Details: System.ArgumentException: Item has already been added. Key in dictionary: 'administratoren' Key being added: 'administratoren'
Source Error:
Linje 116: MembershipUserCollection allUsers;
Linje 117: lock (objLock) {
Linje 118: allUsers = Membership.GetAllUsers();
Linje 119: }
Linje 120:Source File: [WebsiteLocation]\App_Code\MemberInfo.cs Line: 118
Stack Trace: (Please not that the line numbers of MemberInfo.cs in this stacktrace can be a bit off.
[ArgumentException: Item has already been added. Key in dictionary: 'administratoren' Key being added: '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 user) +129
ASPPG.MembershipProviders.ASPPGSqlMembershipProvider.CreateMembershipUserCollectionFromDataView(DataView dv) in H:\My Document\Visual Studio 2008\Projects\forumu\MembershipProviders\ASPPGSqlMembershipProvider.vb:656 ASPPG.MembershipProviders.ASPPGSqlMembershipProvider.GetAllUsers(Int32 pageIndex, Int32 pageSize, Int32& totalRecords) in 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() in d:\Faelles\SVN-exports\DFF-umbraco\App_Code\MemberInfo.cs:71 usercontrols_GetMemberTopList.LoadTopMembers() in d:\Faelles\SVN-exports\DFF-umbraco\usercontrols\GetMemberTopList.ascx.cs:16 usercontrols_GetMemberTopList.Page_Load(Object sender, EventArgs e) in 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(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(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627Version Information: Microsoft .NET Framework Version:2.0.50727.3603; ASP.NET Version:2.0.50727.3618
Contenido de MemberInfo.cs está aquí:
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 "";
}
}
}
}
Gracias de antemano :)
Editar: Se ha añadido nueva fuente de MemberInfo.cs y actualicé el mensaje de error que recibo. Observe que el trazado de pila sigue siendo el anterior, por lo que los números de línea a los que se refiere pueden estar un poco desajustados.
Editar: Mucha información sobre el error ha sido modificada. Nuevo MemberInfo.cs agregado. Se eliminó el código del método de inicio de sesión porque ahora sé que esta no es la causa del error.
¿Puede ser cierto que nadie sabe nada al respecto? :( – EmKay