我们在使用 .NET Remoting 时遇到了一个奇怪的问题。基本上,我们有一个注册两个 TcpChannel 的服务器ChannelServices.RegisterChannel()
:
- 一个监听端口 50000
- 另一个监听端口 15000。
然后我们有一个客户端,它注册了一个 TcpChannel 以便能够与服务器通信。Activator.GetObject()
我们通过使用 URI调用从服务器检索一个对象
“tcp://serverip:50000/objectname”
这工作正常,客户端连接到端口 50000 上的服务器并获取对象。
但是,当我们开始对该对象调用方法时,与端口 50000 上的通道的连接被断开,并自动与端口 15000 上的通道建立新连接。这给我们带来了一个真正的问题,因为我们不希望端口 15000 上的流量,因为该通道可能未绑定到与服务器上的端口 50000 通道相同的网络适配器,或者该端口可能未在防火墙中打开,这会导致远程调用自然会失败。
这对我们来说很奇怪,因为客户端在我们的代码中不知道服务器上的端口 15000 上存在另一个通道或它侦听的 IP,但它却尝试连接到它。
非常感谢您对此的任何帮助,
谢谢,卡斯帕
这是设置服务器通道之一的代码,通常在端口 50000 上:
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, "Server@" + m_tcpPort.ToString() );
这是设置另一个服务器通道的代码,通常在端口 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 + "/Server@" + port);