2009-09-14 8 views
5

Ich versuche, meine eigene Implementierung Generic zu implementieren, aber halten Sie die folgenden Fehler zu erhalten, wenn es um die Ansichten zu laden versucht (Ich verwende asp.net MVC):SerializationException mit benutzerdefinierten GenericIdentiy?

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" 

Ich habe mit der am Ende folgende Klasse:

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

In meinem Global.asax ich ein Cookie eines serialisierten Wert in einen Speicher-Stream lesen und dann verwenden, um mein OpenIDExtendedIdentity-Objekt zu erstellen. Nach unzähligen Versuchen verschiedener Art endete ich mit diesem Lösungsversuch. Es funktioniert bis zu dem Punkt, an dem es versucht, die Ansichten zu rendern.

Was ich im Wesentlichen zu erreichen versuchen, ist die Fähigkeit, die folgenden Aufgaben (Während die Standard-Rollenmanager von asp.net verwenden):

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

ich einige der Quellen aufgelistet habe ich habe lies meinen Versuch, das gelöst zu bekommen. Einige Leute haben einen Cassini-Fehler gemeldet, aber es sieht so aus, als ob andere diese Art benutzerdefinierter Funktionen erfolgreich implementiert hätten.

Antwort

3

Ich bin mir nicht sicher, ob dies ist genau das gleiche Problem, aber ich habe in das gleiche Problem laufen, wenn ich meine eigene Identität zu schaffen Implementierung.

This blog löste mein Problem.

Es scheint, dass das Problem ist ein Problem mit Identität Serialisierung in Cassini gibt es, aber man kann durch Ableiten der Klasse von MarshalByRefObject drum herum kommen:

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

Sie können nicht von Generic erben dann natürlich , aber Sie können immer noch die IIdentity-Schnittstelle implementieren, die GenericIdentity implementiert, so dass Sie das Ding an den meisten Orten verwenden können, die mindestens eine IIdentity erwarten.

0

Es scheint eine Einschränkung oder ein Fehler des VisualStudio (Web Development Server), wenn ich den IIS Express in VS2012 oder die vollständige IIS-Konfiguration verwendet, wurde das Problem behoben. Wie hier vorgeschlagen: https://stackoverflow.com/a/1287129/926064

0

Lösung von "Baggadonuts" bei This post löste mein Problem. Kopierter Code unten.

[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"); 
    } 
} 
Verwandte Themen