2010-05-20 125 views
4

远程处理异常 - 身份验证失败的例外。详细消息说:“无法从传输连接读取数据:连接已关闭。”无法从传输连接读取数据:连接已关闭

我在创建两个可以在C#中作为远程对象进行通信的简单服务器时遇到了问题。 ServerInfo只是我创建的一个拥有IP和端口的类,可以返回地址。它工作正常,就像我以前用过的那样,并且已经调试过了。此外,服务器启动正常,没有任何异常,并且通道注册没有问题。我使用Forms来完成接口,并调用服务器上的某些方法,但在调试时从FormsApplication传递参数给服务器时没有发现任何问题。在这一章中似乎都很好。

public ChordServerProgram() 
     { 
      RemotingServices.Marshal(this, "PADIBook"); 
      nodeInt = 0; 
     } 

     public void startServer() 
     { 
      try 
      { 
       serverChannel = new TcpChannel(serverInfo.Port); 
       ChannelServices.RegisterChannel(serverChannel, true); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.ToString()); 
      } 
     } 

我运行了这个程序的两个实例。然后在应用程序的其中一个实例上调用startNode。端口很好,生成的地址也很好。正如你所看到的,我使用IP作为本地主机,因为这个服务器仅仅用于测试目的。

public void startNode(String portStr) 
      { 
       IPAddress address = IPAddress.Parse("127.0.0.1"); 
       Int32 port = Int32.Parse(portStr); 
       serverInfo = new ServerInfo(address, port); 

       startServer(); 

       //node = new ChordNode(serverInfo,this); 

      } 

然后,在其他的方面,再次通过接口,我调用另一个startNode方法,给它一个种子服务器来获取信息。这是它出错的地方。当它调用刚刚获得的seedServer代理上的方法时,由于验证失败,会抛出RemotingException。 (我想要得到的参数是节点,我只是用INT以确保ChordNode类无关,此错误。)

 public void startNode(String portStr, String seedStr) 
     { 
      IPAddress address = IPAddress.Parse("127.0.0.1"); 
      Int32 port = Int32.Parse(portStr); 
      serverInfo = new ServerInfo(address, port); 

      IPAddress addressSeed = IPAddress.Parse("127.0.0.1"); 
      Int32 portSeed = Int32.Parse(seedStr); 
      ServerInfo seedInfo = new ServerInfo(addressSeed, portSeed);    

      startServer(); 

      ChordServerProgram seedServer = (ChordServerProgram)Activator.GetObject(typeof(ChordServerProgram), seedInfo.GetFullAddress()); 

//   node = new ChordNode(serverInfo,this); 
      int seedNode = seedServer.nodeInt; 
//   node.chordJoin(seedNode.self); 

     } 

回答

0

尝试ensureSecurity设置为false,它应该开始工作。
ChannelServices.RegisterChannel(serverChannel, false);

+0

是的,但是如果我们想要启用安全性呢? – Gareth 2012-01-11 16:04:42

0

你指定安全是startserver的(你的远程处理服务器上)必须具有:

ChannelServices.RegisterChannel(serverChannel, true); 

然而,“客户”端未指定的安全性,因此授权错误。除非服务器安全设置设置为'false',否则需要在两端指定tcp通道安全性。在你的第二个方法的StartNode你需要使用Activator.GetObject之前做到以下几点,注意无不像服务器端上的TcpChannel指定端口:

TcpChannel ClientChan = new TcpChannel();    
ChannelServices.RegisterChannel(ClientChan, true); 

此外,除非你是在一些代码,做你的避风港”没有给我们,你也似乎没有注册一个众所周知的服务类型服务器端,虽然你说它一直在调试器中工作,所以也许这是没有必要的情况下。请参阅MSDN on RegisterWellKnownServiceType

相关问题