我正在尝试实现自己的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错误,但似乎其他人已经成功实现了这种类型的自定义功能 - 因此令人难以置信。
答案 0 :(得分:3)
我不确定这是否是完全相同的问题,但在尝试创建自己的身份实现时遇到了同样的问题。
This blog解决了我的问题。
似乎问题是Cassini中的身份序列化存在问题,但你可以通过从MarshalByRefObject派生你的类来解决它:
[Serializable]
public class MyUser : MarshalByRefObject, IIdentity
{
public int UserId ...
当然,你不能继承GenericIdentity,但是你仍然可以实现GenericIdentity实现的IIdentity接口,所以你可以在大多数地方使用这个东西,至少可以使用IIdentity。
答案 1 :(得分:0)
这似乎是VisualStudio(Web开发服务器)的限制或错误,当我在VS2012中使用IIS Express或完整的IIS配置时,问题得到解决。像这里建议的那样:https://stackoverflow.com/a/1287129/926064
答案 2 :(得分:0)
来自This post的“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");
}
}