2009-04-09 5 views
14

리모틀링을 통해 노출되는 싱글 톤 클래스에 약간의 문제가 있습니다. 내 서버에서 내가 가진 :.Net 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의 개인 생성자가 디버깅 중에 두 번 눌려 졌음을 확인했습니다.

내 서버 코드에서 Remotable을 통해 RemotableObject에 인스턴스를 가져 오는 경우 원하는 동작을 얻을 수 있지만 원격 오버 헤드없이 서버에서 내 클라이언트와 동일한 개체에 액세스 할 수있는 방법이 있습니까?

답변

30

내가 무엇을했는지 이해했다면 (서버에 객체를 저장하려고하지만 모든 클라이언트 호출이 서버에서 객체의 동일한 인스턴스를 가져오고 서버에서 호출을 원할 경우 ?

var MesgUri = "tcp://ServerName:nnnn/MyMsgEndpointUri"; 
: 서버는 "서버 이름"경우 코드가

다음) 같은 인스턴스를 얻을, 그것은 "MyMsgEndpointUri"으로 열린 우리당과, 포트 NNNN에서 수신 대기, 당신은 열린 우리당을 정의 서버의

다음과 같이 엔드 포인트를 초기화하십시오.

RemotingServices.Marshal([singletonInstance], MesgURI); 
대신도 RegisterWellKnownServiceType();

, 싱글을 나타내는 클래스, 널 조작으로 InitializeLifetimeService의 속성을 재정의하는 것을 잊지 ... 또는 싱글 톤 객체가 어떤 시점에서 수집 된 쓰레기를 얻을 것이다의

...

public override object InitializeLifetimeService() { return (null); } 
서버에서

, 그냥 Activator.GetObject를 호출 한 번도 안 써봤

+0

완벽하게 작동했습니다. 빠른 답변 감사합니다! – Todd

+0

'메지리'의 가치는 무엇입니까? 내 TCP 채널은'UsersTcp'라고 불리우며 그 이름과 uri로 시도했습니다 :'tcp : // localhost : 5000/UserTcp' 그리고 둘 다 서비스 발견 오류가 없습니다. – moondaisy

+0

'tcp : // MYSERVERNAME : 5212/UsersTcp'와 같이'tcp : // [ServerName] : [PortNumber]/MesgUri'이어야합니다. –

-2

서버의 클라이언트 메모리를 읽을 방법이 없습니다.

-1

... 원격 전혀 호출을 사용하지 마십시오 ... 그 싱글 인스턴스에 대한 액세스를 얻으려면 싱글 톤 클래스 '정적 팩토리 메소드를 호출 서버 쪽에서 ,하지만 그 클라이언트가 사용하는 동일한 인스턴스를 반환해야합니다. 그러나, 당신은 여전히 ​​프록시를 얻을 것입니다.