在.Net Remoting中与单身人士合作

时间:2009-04-09 20:29:04

标签: c# .net singleton remoting

我正在通过远程处理暴露的单例类有点问题。在我的服务器中,我有:

TcpChannel channel = new TcpChannel( Settings.Default.RemotingPort );
ChannelServices.RegisterChannel( channel, false );
RemotingConfiguration.RegisterWellKnownServiceType( 
    typeof( RemotableObject ), "RemotableObject", 
    WellKnownObjectMode.Singleton );

RemotableObject是一个继承MarshalByRefObject的单例对象。

我的客户通过以下方式连接到它:

remoteObject = (RemotableObject)Activator.GetObject(
    typeof( RemotableObject ),
    string.Format( "tcp://{0}:{1}/RemotableObject", serverIP, serverPort ) );

就远程处理而言,一切都很有效,但当我在服务器代码中访问单例对象时,这样:

int someValue = RemotableObject.Instance.SomeDynamicValue;

它访问与客户端不同的实例。我还验证了RemotableObject中的私有构造函数在调试时会被击中两次。

如果通过我的服务器代码中的远程处理获取RemotableObject的实例,我可以获得所需的行为,但有没有一种方法可以从服务器访问与客户端相同的对象而没有远程处理开销?

3 个答案:

答案 0 :(得分:30)

如果我理解你所追求的是什么,(你希望对象存在于服务器上,但是你希望所有客户端调用在服务器上获得相同的对象实例,并且你也希望在服务器代码中调用获得相同的实例?)

然后,如果您的服务器是“ServerName”,并且它正在侦听端口nnnn,并且Uri为“MyMsgEndpointUri”,则您已将Uri定义为:

var MesgUri = "tcp://ServerName:nnnn/MyMsgEndpointUri"; 

在您的服务器中,通过以下方式初始化端点:

RemotingServices.Marshal([singletonInstance], MesgURI);  

而不是RegisterWellKnownServiceType();

另外,在表示单例的类中,记得使用null操作覆盖InitializeLifetimeService属性...或者单例对象将在某个时刻收集垃圾...

public override object InitializeLifetimeService() { return (null); }

从服务器,只需调用你的单例类的静态工厂方法来访问该单例实例......根本不要使用远程调用...

答案 1 :(得分:-1)

我从未尝试从服务器端调用Activator.GetObject,但这应该返回客户端正在使用的相同实例。但是,你仍然会得到一个代理。

答案 2 :(得分:-2)

没有

无法读取服务器中客户端的内存。