在我的Azure Web角色代码中,我有一个CustomIdentity派生自的类System.Security.Principal.IIdentity.在某些时候,.NET运行时尝试序列化该类,序列化将无法正常工作.试图解决我搜索了很多,找到了这个答案,并试图继承我的班级MarshalByRefObject.
现在,一旦我的CustomIdentity类继承,MarshalByRefObject就不再有序列化尝试了,我的代码就可以工作了.但是,我想知道使用MarshalByRefObject类的性能影响.
我的代码运行方式如下.首先,请求到达IIS并传递给身份验证代码,该代码创建实例CustomIdentity并将该实例附加到HTTP上下文.然后一段时间后,相同的HTTP上下文被传递给ASP.NET处理程序,该处理程序CustomIdentity最多访问该实例一次.该CustomIdentity对象的生活为请求的时间,然后被销毁.
现在通过序列化,我CustomIdentity将序列化为流,然后从该流反序列化为新对象.由于MarshalByRefObject没有序列化,但创建了代理,并且访问将通过RPC封送到实际对象所在的位置.
MarshalByRefObject在这种情况下使用会有多贵?哪个 - MarshalByRefObject或序列化 - 会更昂贵?
我试着:
((Request.Params["crmid"] != null))
Run Code Online (Sandbox Code Playgroud)
在网页中.但它不断抛出序列化异常:
类型"QC.Security.SL.SiteUser"在组件"QC.Security,版本= 1.0.0.1,文化=中性公钥=空"未标记为可序列.
然而,类型(自定义IIdentity)标记为可序列化如下:
[Serializable()]
public class SiteUser : IIdentity
{
private long _userId;
public long UserId { get { return _userId; } set { _userId = value; } }
private string _name;
public string Name { get { return _name; } }
private bool _isAuthenticated;
public bool IsAuthenticated { get { return _isAuthenticated; } }
private string _authenticationType;
public string AuthenticationType { get { return _authenticationType; } }
Run Code Online (Sandbox Code Playgroud)
我不知道如何调试这个,因为我无法进入序列化器代码,以找出它为什么会摔倒.调用堆栈在到达[外部代码]之前只有一帧深度.并且错误消息是无用的,因为类型明确标记为可序列化.试验和错误调整也产生了一个类型未解决的成员异常.
它工作正常.但现在"突然间"它并不通常意味着Visual Studio中的一些愚蠢的错误,但重启并没有帮助"这个"时间.所以现在我不知道这是一个愚蠢的VS错误还是一个完全不相关的错误,我得到了序列化异常或者我做错了什么.
事实上,我不再相信VS了,因为过去几个月我一直在进行的疯狂追逐数量,这是通过重新启动VS 2008或其他一些荒谬的解决办法来"修复"的.