由自定义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'.]

我不太熟悉序列化,也不太明白发生了什么或者问题是什么。你能帮我开导一下吗?谢谢。

由自定义Identity和GenericPrincipal引起的序列化异常

您是否在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上测试它。这似乎是最简单的解决办法。