СериализацияException с пользовательским GenericIdentiy? - PullRequest
5 голосов
/ 14 сентября 2009

Я пытаюсь реализовать свою собственную реализацию GenericIdentity, но продолжаю получать следующую ошибку, когда она пытается загрузить представления (я использую asp.net MVC):

 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"

Я закончил со следующим классом:

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

В моем Global.asax я считываю сериализованное значение cookie в поток памяти и затем использую его для создания моего объекта OpenIDExtendedIdentity. Я закончил эту попытку решения после бесчисленных попыток различных видов. Он работает корректно вплоть до того момента, когда он пытается отобразить представления.

То, чего я в основном пытаюсь достичь, - это возможность сделать следующее (при использовании менеджера ролей по умолчанию из asp.net):

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

Я перечислил некоторые источники, которые я прочитал, пытаясь решить эту проблему. Некоторые люди сообщают об ошибке Cassini, но, похоже, что другие добились успеха в реализации этого типа пользовательских функций - таким образом, я поражен.

Ответы [ 3 ]

3 голосов
/ 18 марта 2010

Я не уверен, что это точно такая же проблема, но я столкнулся с той же самой проблемой, пытаясь создать свою собственную реализацию идентичности.

Этот блог решил мою проблему.

Кажется, проблема в том, что существует проблема с сериализацией идентичности в Cassini, но вы можете обойти ее, извлекая свой класс из MarshalByRefObject:

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

Тогда вы, конечно, не можете наследовать от GenericIdentity, но вы все равно можете реализовать интерфейс IIdentity, который реализует GenericIdentity, так что вы можете использовать его в большинстве мест, которые ожидают IIdentity по крайней мере.

0 голосов
/ 01 декабря 2014

Решение от "baggadonuts" на Этот пост решил мою проблему. Скопированный код ниже.

[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");
    }
}
0 голосов
/ 18 декабря 2013

Кажется, что это ограничение или ошибка VisualStudio (сервера веб-разработки), когда я использовал IIS Express в VS2012 или полную конфигурацию IIS, проблема была исправлена. Как и здесь предлагается: https://stackoverflow.com/a/1287129/926064

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...