У нас возникла странная проблема с .NET Remoting. По сути, у нас есть сервер, который регистрирует два TcpChannels с ChannelServices.RegisterChannel()
:
- Один слушает порт 50000
- Другой слушает порт 15000.
Затем у нас есть клиент, который регистрирует TcpChannel, чтобы иметь возможность общаться с сервером. Мы получаем объект с сервера, вызывая Activator.GetObject()
с URI
"tcp: // serverip: 50000 / имя объекта"
и это работает нормально, клиент подключается к серверу через порт 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);