Abbiamo problemi con .NET Remoting. In sostanza, abbiamo un server che registra due TcpChannels con ChannelServices.RegisterChannel()
:Servizi remoti .NET che commutano da soli i canali
- Un ascolto sulla porta 50000
- altro in ascolto sulla porta 15000.
Poi abbiamo un cliente che registra un TcpChannel per essere in grado di comunicare con il server. Recuperiamo un un oggetto dal server chiamando Activator.GetObject()
con l'URI
"tcp: // serverip: 50000/nomeoggetto"
e questo funziona bene, il client si connette al server sulla porta 50000 e ottiene l'oggetto.
Tuttavia, quando iniziamo a chiamare i metodi su quell'oggetto, la connessione al canale sulla porta 50000 viene interrotta e viene effettuata automaticamente una nuova connessione al canale sulla porta 15000. Questo rappresenta un vero problema per noi dal momento che non vogliamo il traffico sulla porta 15000 perché quel canale potrebbe non essere associato alla stessa scheda di rete del canale porta 50000 sul server o quella porta potrebbe non essere aperta nel firewall, il che causa le chiamate in remoto per fallire naturalmente.
Questo è molto strano per noi dal momento che il client non è a conoscenza nel nostro codice che esiste un altro canale sul server sulla porta 15000 o quale IP ascolta, ma tenta di connettersi ad esso.
Qualsiasi aiuto su questo è molto apprezzato,
Grazie, Casper
Questo è il codice che imposta uno dei canali del server, quello di solito sulla porta 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, "[email protected]" + m_tcpPort.ToString());
Questo è il codice che imposta l'altro canale del server, in genere sulla porta 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.
Questo è il codice nel client che si connette al server di primo canale, quello che di solito sulla porta 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);
Se si dispone di una configurazione di canale nel file app.config, aggiungerla alla domanda. –
Grazie per aver risposto. Non c'è alcuna configurazione di app.config poiché è tutto configurato nel codice. Ho aggiunto quel codice alla domanda ora. – Casper