由自定义Identity和GenericPrincipal引起的序列化异常
本文关键字:序列化 异常 GenericPrincipal 自定义 Identity | 更新日期: 2023-09-27 18:11:42
我一直在阅读一篇关于如何使用。net实现自定义Basic身份验证的文章。
这篇文章
代码使用了一个接口- IBasicUser -派生自IIdentity。类BasicUser实现了IBasicUser。创建BasicUser的实例,并从该实例构造GenericPrincipal。
IBasicUser bu = new BasicUser();
context.Context.User = new GenericPrincipal(bu, new string[] { });
当我运行代码时,我得到一个异常。
Type 'Smithfamily.Blog.Samples.BasicUser' in assembly 'LM_TESTS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.
所以我看了看反射器中的System.Security.Principal.GenericIdentity类,发现它确实被标记为属性[Serializable]。ComVisible(真正的)]
关于IIdentity的文档没有提到任何需要序列化的实现。从异常和反射器中,我假设它确实存在。所以我给BasicUser类添加了[Serializable]属性。
现在,当我运行代码时,我得到一个新的异常。
[SerializationException: Type is not resolved for member 'Smithfamily.Blog.Samples.BasicUser,LM_TESTS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.]
我不太熟悉序列化,也不太明白发生了什么或者问题是什么。你能帮我开导一下吗?谢谢。
您是否在VS web开发服务器中托管您的网站?如果是这样,看起来你无意中发现了MS Connect中记录的错误…
http://connect.microsoft.com/VisualStudio/feedback/details/274696/using-custom-identities-in-asp-net-fails-when-using-the-asp-net-developement-server如果我正确地阅读了这个和其他关于它的帖子,修复是ging你的DLL,以便它可以被。net探测正确地找到并在运行时加载。
变化:
public class CustomIdentity : IIdentity
为:public class CustomIdentity : MarshalByRefObject, IIdentity
不要用:
[Serializable]
public class CustomIdentity : IIdentity
最后,我刚刚从在VWD开发服务器上测试我的应用程序切换到在windows 7上的本地iis 7.5 express上测试它。这似乎是最简单的解决办法。