हमें .NET Remoting के साथ एक अजीब समस्या है। असल में, हम एक सर्वर जो ChannelServices.RegisterChannel()
के साथ दो TcpChannels पंजीकृत करता है:.NET Remoting स्विचिंग चैनल स्वयं ही
- एक बंदरगाह पर सुनता 50000
- अन्य एक बंदरगाह पर सुनता है 15000.
हम तो एक ग्राहक है कि करने के लिए एक TcpChannel पंजीकृत करता है सर्वर के साथ संवाद करने में सक्षम हो। हम यूआरआई
साथ
Activator.GetObject()
फोन करके सर्वर से एक एक वस्तु प्राप्त करें "टीसीपी: // serverip: 50000/objectname"
और इस ठीक काम करता है, ग्राहक बंदरगाह पर सर्वर से कनेक्ट 50000 और वस्तु प्राप्त करता है।
हालांकि, जब हम उस ऑब्जेक्ट पर कॉलिंग विधियों को प्रारंभ करना शुरू करते हैं, तो पोर्ट 50000 पर चैनल से कनेक्शन गिरा दिया जाता है, और चैनल 15000 पर स्वचालित रूप से चैनल के साथ एक नया कनेक्शन बनाया जाता है। यह हमारे लिए एक वास्तविक समस्या है क्योंकि हम पोर्ट 15000 पर यातायात नहीं चाहते हैं क्योंकि वह चैनल सर्वर पर बंदरगाह 50000 चैनल के रूप में एक ही नेटवर्क एडेप्टर से बंधे नहीं हो सकता है या वह पोर्ट फ़ायरवॉल में खुला नहीं हो सकता है, जिसके कारण स्वाभाविक रूप से विफल होने के लिए रिमोटिंग कॉल।
यह हमारे लिए बहुत अजीब है क्योंकि ग्राहक को हमारे कोड में कोई ज्ञान नहीं है कि पोर्ट 15000 पर सर्वर पर एक और चैनल मौजूद है या यह किस आईपी को सुनता है, फिर भी यह उससे जुड़ने का प्रयास करता है।
IDictionary props = new Hashtable();
props["port"] = m_tcpPort;
props["name"] = String.Empty;
BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider();
serverProvider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
BinaryClientFormatterSinkProvider clientProvider = new BinaryClientFormatterSinkProvider();
m_tcpChannel = new TcpServerChannel(props, /*clientProvider,*/ serverProvider);
ChannelServices.RegisterChannel(m_tcpChannel, false);
m_wellKnownObjRef = RemotingServices.Marshal(this, "[email protected]" + m_tcpPort.ToString());
:
इस पर कोई मदद बहुत सराहना की है,
धन्यवाद, कैस्पर
इस कोड है कि सर्वर चैनलों में से एक है, आमतौर पर पोर्ट 50000 पर एक सेट करता है
यह वह कोड है जो अन्य सर्वर चैनल सेट करता है, आमतौर पर पोर्ट 15000:
IDictionary props = new Hashtable();
props["name"] = String.Empty;
props["port"] = ip.Port;
props["bindTo"] = ip.Address.ToString();
props["timeout"] = REMOTING_TIMEOUT; // Timeout to prevent hung remoting calls.
if (!String.IsNullOrEmpty(machineName))
{
props["machineName"] = machineName;
}
BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider();
serverProvider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
BinaryClientFormatterSinkProvider clientProvider = new BinaryClientFormatterSinkProvider();
m_channel = new TcpChannel(props, clientProvider, serverProvider);
ChannelServices.RegisterChannel(m_channel, false);
m_objRef = RemotingServices.Marshal(this, QueueName); // Queuename is a GUID.
इस ग्राहक पहली बार सर्वर चैनल से कनेक्ट होता है में कोड, एक बंदरगाह 50000 पर आमतौर पर है कि है:
IDictionary props = new Hashtable();
props["port"] = 0;
RemotingConfiguration.CustomErrorsMode = CustomErrorsModes.Off;
BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider();
serverProvider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
BinaryClientFormatterSinkProvider clientProvider = new BinaryClientFormatterSinkProvider();
m_tcpChannel = new TcpClientChannel(props, clientProvider/*, serverProvider*/);
ChannelServices.RegisterChannel(m_tcpChannel, false);
string address = "tcp://" + profile.RemoteIP + ":" + profile.RemoteTCP;
m_server = (Kernel)Activator.GetObject(typeof(Server), address + "/[email protected]" + port);
यदि आपके पास app.config फ़ाइल में कोई चैनल कॉन्फ़िगरेशन है तो इसे अपने प्रश्न में जोड़ें। –
उत्तर देने के लिए धन्यवाद। कोई app.config कॉन्फ़िगरेशन नहीं है क्योंकि यह कोड में सभी सेटअप है। मैंने उस कोड को अब प्रश्न में जोड़ा है। – Casper