在我的Azure网络角色代码中,我有一个CustomIdentity
类派生自System.Security.Principal.IIdentity
。在某些时候.NET运行时tries to serialize that class和serialization wouldn't work。试图解决我搜索过的问题并找到this answer并尝试从MarshalByRefObject
继承我的课程。
现在,当我的CustomIdentity
类继承自MarshalByRefObject
时,不再有序列化尝试,我的代码也能运行。但是,我想知道使用MarshalByRefObject
类的性能影响。
我的代码就像这样运行。首先,请求到达IIS并传递给创建CustomIdentity
实例的身份验证代码,并将该实例附加到HTTP上下文。然后一段时间后,相同的HTTP上下文被传递给ASP.NET处理程序,该处理程序最多访问一次CustomIdentity
实例。 CustomIdentity
对象在请求期间存在,然后被销毁。
现在通过序列化,我的CustomIdentity
将序列化为一个流,然后从该流反序列化为一个新对象。使用MarshalByRefObject
时,没有序列化,但会创建代理,并且访问将通过RPC封送到实际对象所在的位置。
在这种情况下使用MarshalByRefObject
会有多贵?哪个 - MarshalByRefObject
或序列化 - 会更昂贵?
答案 0 :(得分:8)
MarshalByRefObject
表示所有调用(方法,属性等)都通过网络进行代理。这可能意味着,您不是在传输的数据上本地传输数据,然后在本地运行多种方法等,而是进行网络调用每次访问。例如,多少次(每个请求)是一个角色测试?或者查询的名字?老实说,我不知道,但我猜它超过1(全部总计)。加上原来的设置费用......
带宽可能不会很大,但延迟 非常 非常重要,特别是如果您有分布式节点(因为您提到了云方案)。
就我个人而言,我会像瘟疫一样避免MarshalByRefObject
,但取决于你......