题
我们有一个奇怪的问题。网远程处理。基本上,我们有一个服务器寄存器中的两个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);
解决方案
我们已经记录的支持的情况下与Microsoft关于这一点,显然,我们在这里所做的是不支持的。网远程处理。你只允许登记一个通道的各个类型中的一个程序域.什么远程处理的不会是它发回URI对象的客户来告诉它,它可以访问的对象的问题。当它,它看起来通过注册的渠道在服务器的端和使用的第一道发现有类型相匹配的要求(在我们的情况:Tcp)。换句话说,它会使用什么频道发生得到登记的第一次。它不在乎什么样的通道的客户都有连接。
该方案是实现自己的IClientChannelSinkProvider在客户端。当你执行CreateSink()方法你可以选择什么url你想要的客户连接到当创建的水槽的使用。
其他提示
我没有stuggle与那些"backlinked"港口;我以为这只会发生服务器如果想要发送回(即使在事件过程)。因为我总是问题的防火墙,我切换到GenuineChannels(虽然我认为这是一个有点过时).