2009-04-09 9 views
14

में सिंगलेट्स के साथ काम करना मुझे एक सिंगलटन क्लास के साथ समस्या है जिसमें मैं रिमोटिंग के माध्यम से खुलासा कर रहा हूं। अपने सर्वर में मेरे पास है:नेट रीमोटिंग

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 को एक उदाहरण प्राप्त करता हूं, तो वांछित व्यवहार प्राप्त कर सकता हूं, लेकिन क्या ऐसा कोई तरीका है कि मैं अपने क्लाइंट को रिमोटिंग ओवरहेड के बिना सर्वर से उसी ऑब्जेक्ट तक पहुंच सकता हूं?

उत्तर

30

यदि मैं समझता हूं कि आप क्या कर रहे हैं, (आप चाहते हैं कि ऑब्जेक्ट सर्वर पर रहें, लेकिन आप चाहते हैं कि सभी ग्राहक कॉल सर्वर पर ऑब्जेक्ट का एक ही उदाहरण प्राप्त करें, और आप सर्वर में कॉल भी चाहते हैं ?

var MesgUri = "tcp://ServerName:nnnn/MyMsgEndpointUri"; 
: यदि आपके सर्वर है "सर्वर नाम" कोड, कि एक ही उदाहरण पाने के लिए)

तो, और यह बंदरगाह NNNN पर सुन रहा है, के रूप में "MyMsgEndpointUri" उरी के साथ, आप के रूप में परिभाषित किया है उरी

अपने सर्वर में, एंडपॉइंट को आरंभ करें:

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

भी वर्ग सिंगलटन का प्रतिनिधित्व करने में, एक अशक्त संचालन के साथ InitializeLifetimeService संपत्ति ओवरराइड करने के लिए याद है ... या सिंगलटन वस्तु कुछ बिंदु पर एकत्र कचरा मिल जाएगा करने के बजाय

...

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

सर्वर से, सिर्फ इतना है कि सिंगलटन उदाहरण के लिए उपयोग करने के लिए आपकी सिंगलटन वर्गों 'स्थिर कारखाने विधि कॉल ... का प्रयोग न करें दूरस्थ बिल्कुल कॉल ...

+0

यह पूरी तरह से काम किया! शीघ्र जवाब देने के लिए ध्न्यवाद! – Todd

+0

'मेसगुरी' का मूल्य क्या होना चाहिए? मेरे टीसीपी चैनल को 'यूजर टीसीपी' कहा जाता है और मैंने उस नाम के साथ और यूरी के साथ प्रयास किया है: 'tcp: // localhost: 5000/userTcp' और दोनों मुझे कोई सेवा नहीं मिली त्रुटि प्रदान करते हैं। – moondaisy

+0

यह 'tcp: // [ServerName] होना चाहिए: [PortNumber]/MesgUri'' tcp: // MYSERVERNAME: 5212/usersTcp' –

-2

सं

कोई रास्ता नहीं सर्वर में ग्राहक की स्मृति को पढ़ने के लिए नहीं है।

-1

मैं Activator.GetObject कॉल करने की कोशिश कभी नहीं किया है सर्वर से तरफ से , लेकिन उस क्लाइंट का उपयोग कर रहे एक ही उदाहरण को वापस करना चाहिए। लेकिन, आप अभी भी प्रॉक्सी प्राप्त करने जा रहे हैं।