TcpChannel注册问题

时间:2010-01-20 23:04:19

标签: c# remoting channel

我在这里读到:Error 10048 when trying to open TcpChannel

我有我认为类似的问题 - 显然不是。我接受了第一个响应者的建议来重置winsock(无论如何,winsock如何被破坏?)无论如何,这是我的频道注册:

 channel = new TcpChannel(channelPort);
 ChannelServices.RegisterChannel(channel, false);

和客户电话:

 // Create a channel for communicating w/ the remote object
 // Notice no port is specified on the client
 TcpChannel channel = new TcpChannel();
 ChannelServices.RegisterChannel(channel, false);

 // Create an instance of the remote object
 CommonDataObject obj = Activator.GetObject( typeof(CommonDataObject) ,
  "tcp://localhost:49500/CommonDataObject") as CommonDataObject;

这似乎太简单了,不能使用这么麻烦。但是,问题似乎与服务器的ChannelServices.RegisterChannel(...)有关。现在,我包含客户端部分的原因是因为客户端实例检查服务器对象。如果它找不到它,那么它“轻推”服务器实例化。我想知道的是,如果首先检查对象的可用性(la:Activator.GetObject(...))会导致ChannelServices“认为”这个tcp通道已经注册了吗?这听起来很愚蠢,但这是我唯一可能的解释。我关闭了防火墙,反真菌应用程序,然后重新启动。还是收到这个

  

频道'tcp'已经存在   注册

我查看了我的堆栈跟踪并注意到了:

   at System.Runtime.Remoting.Channels.ChannelServices.RegisterChannelInternal(IChannel chnl, Boolean ensureSecurity)
   at System.Runtime.Remoting.Channels.ChannelServices.RegisterChannel(IChannel chnl, Boolean ensureSecurity)

我想知道RegisterChannelInternal(...)是否可能导致'已注册'问题。所以,除此之外,我不知所措......

我正在检查该频道的呼叫是否可能导致该呼叫。如果这是达成共识,那么我的问题将变为:我如何轮询频道?

更新: 从客户端删除服务器的初始检查并“假设”服务器需要实例化后,我确实发现客户端检查导致了问题。我设法让服务器运行,客户端确实得到了一个“透明代理”对象。但问题仍然存在:“如何进行轮询以发现服务器是否已实例化?”

1 个答案:

答案 0 :(得分:0)

答案很明显,是的......当客户端注册通道时,它会阻止服务器注册另一个Tcp通道。我已经删除了Tcp通道的客户端实例和注册。

由于我还没有得到关于ping的答案,我将在obj = Activator.GetObject(...)上使用try / catch块。如果obj返回null,那么我'nudge'服务器,它会激活...然后客户端连接CommonDataObject(从MarshalByRefObject派生)。

所以,从某种意义上说,这就是我正在使用的轮询技术。我想要更优雅的东西 - 也就是说,通过导致失败而无效的实现。对我来说,这更像是一个黑客而不是解决方案。

我找到了答案here。感谢Abhijeet无意中解决了!顺便说一下......别忘了宣布:

using System.Linq;