2009-09-14 17 views
5

Estoy tratando de poner en práctica mi propia aplicación GenericIdentity pero seguir recibiendo el siguiente error cuando se intenta cargar los puntos de vista (estoy usando asp.net MVC):SerializationException con GenericIdentiy personalizado?

System.Runtime.Serialization.SerializationException was unhandled 
by user code Message="Type is not resolved for member 
'OpenIDExtendedIdentity,Training.Web, Version=1.0.0.0, 
Culture=neutral, PublicKeyToken=null'." 
     Source="WebDev.WebHost" 

he terminado con el la clase siguiente:

[Serializable] 
    public class OpenIDExtendedIdentity : GenericIdentity { 
     private string _nickName; 
     private int _userId; 

     public OpenIDExtendedIdentity(String name, string nickName, int userId) 
      : base(name, "OpenID") { 
      _nickName = nickName; 
      _userId = userId; 
     } 
     public string NickName { 
      get { return _nickName; } 
     } 

     public int UserID { 
      get { return _userId; } 
     } 
    } 

En mi Global.asax leí valor serializado de una galleta en una secuencia de memoria y luego utilizar eso para crear mi objeto OpenIDExtendedIdentity. Terminé con este intento de solución después de innumerables intentos de varios tipos. Funciona correctamente hasta el punto donde intenta renderizar las vistas.

Lo que estoy tratando de lograr en esencia es la capacidad de hacer lo siguiente (al utilizar el gestor por defecto Rol de asp.net):

User.Identity.UserID 
User.Identity.NickName 
... etc. 

He enumerado algunas de las fuentes que he leer en mi intento de resolver esto. Algunas personas han informado sobre un error de Cassini, pero parece que otros han tenido éxito implementando este tipo de funcionalidad personalizada, por lo que me he quedado boquiabierto.

Respuesta

3

no estoy seguro si esto es exactamente el mismo problema, pero me he encontrado con el mismo problema al intentar crear mi propia identidad implementación.

This blog ha resuelto mi problema.

Parece que el problema es que hay un problema con la serialización de identidad en la Cassini, pero se puede conseguir alrededor de él mediante la derivación de la clase de MarshalByRefObject:

[Serializable] 
public class MyUser : MarshalByRefObject, IIdentity 
{ 
    public int UserId ... 

No se puede heredar de GenericIdentity entonces, por supuesto , pero aún puede implementar la interfaz de IIdentity que implementa GenericIdentity, para que pueda usarla en la mayoría de los lugares que esperan un IIdentity al menos.

0

parece ser una limitación o un fallo de la VisualStudio (Desarrollo Web Server), cuando utilicé el Expreso de IIS en VS2012 o la configuración de IIS llena, el problema se solucionó. Como se sugiere aquí: https://stackoverflow.com/a/1287129/926064

0

La solución de "baggadonuts" en This post resolvió mi problema. Código copiado a continuación.

[Serializable] 
public class StubIdentity : IIdentity, ISerializable 



public void GetObjectData(SerializationInfo info, StreamingContext context) 
{ 
    if (context.State == StreamingContextStates.CrossAppDomain) 
    { 
     GenericIdentity gIdent = new GenericIdentity(this.Name, this.AuthenticationType); 
     info.SetType(gIdent.GetType()); 

     System.Reflection.MemberInfo[] serializableMembers; 
     object[] serializableValues; 

     serializableMembers = FormatterServices.GetSerializableMembers(gIdent.GetType()); 
     serializableValues = FormatterServices.GetObjectData(gIdent, serializableMembers); 

     for (int i = 0; i < serializableMembers.Length; i++) 
     { 
      info.AddValue(serializableMembers[i].Name, serializableValues[i]); 
     } 
    } 
    else 
    { 
     throw new InvalidOperationException("Serialization not supported"); 
    } 
} 
Cuestiones relacionadas