2009-09-14 4 views
5

Je suis en train de mettre en œuvre ma propre implémentation de GenericIdentity mais continuer à recevoir l'erreur suivante quand il tente de charger les vues (j'utilise asp.net MVC):SerializationException avec GenericIdentiy personnalisé?

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" 

J'ai fini avec la classe suivante:

[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; } 
     } 
    } 

Dans mon Global.asax je lis valeur sérialisée d'un cookie dans un flux de mémoire et l'utiliser ensuite pour créer mon objet OpenIDExtendedIdentity. Je me suis retrouvé avec cette tentative de solution après d'innombrables essais de toutes sortes. Cela fonctionne correctement jusqu'au moment où il essaie de rendre les vues.

Ce que je tente essentiellement d'atteindre est la capacité à effectuer les opérations suivantes (Lorsque vous utilisez le gestionnaire de rôles par défaut de asp.net):

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

J'ai énuméré quelques-unes des sources que j'ai lire dans ma tentative pour résoudre ce problème. Certaines personnes ont rapporté une erreur de Cassini, mais il semble que d'autres ont eu du succès dans l'implémentation de ce type de fonctionnalité personnalisée - ce qui est stupéfiant pour moi.

Répondre

3

Je ne suis pas sûr que ce soit exactement la même question, mais j'ai couru dans le même problème en essayant de créer mon propre identité la mise en oeuvre.

This blog résolu mon problème.

Il semble que le problème est qu'il ya un problème avec la sérialisation d'identité Cassini, mais vous pouvez la contourner en dérivant votre classe de MarshalByRefObject:

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

Vous ne pouvez pas hériter de GenericIdentity puis, bien sûr , mais vous pouvez toujours implémenter l'interface IIdentity que GenericIdentity implémente, de sorte que vous pouvez utiliser la chose dans la plupart des endroits qui attendent un IIdentity au moins.

0

Il semble être une limitation ou un bug de VisualStudio (Web Development Server), lorsque j'ai utilisé l'IIS Express dans VS2012 ou la configuration complète d'IIS, le problème a été résolu. Comme suggéré ici: https://stackoverflow.com/a/1287129/926064

0

La solution de "baggadonuts" à This post a résolu mon problème. Code copié ci-dessous.

[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"); 
    } 
} 
Questions connexes