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

Tod*_*odd 14 .net c# remoting singleton

我通过远程处理暴露了单例类,我遇到了一些问题.在我的服务器中,我有:

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

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

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

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

就远程处理而言,一切都很好,但是当我在服务器代码中访问单例对象时,如下所示:

int someValue = RemotableObject.Instance.SomeDynamicValue;
Run Code Online (Sandbox Code Playgroud)

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

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

Cha*_*ana 30

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

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

var MesgUri = "tcp://ServerName:nnnn/MyMsgEndpointUri"; 
Run Code Online (Sandbox Code Playgroud)

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

RemotingServices.Marshal([singletonInstance], MesgURI);  
Run Code Online (Sandbox Code Playgroud)

代替 RegisterWellKnownServiceType();

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

public override object InitializeLifetimeService() { return (null); }
Run Code Online (Sandbox Code Playgroud)

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