例外是Remoting Exception - 身份验证失败。详细消息显示“无法从传输连接读取数据:连接已关闭。”
我在创建两个可以作为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 for localhost,因为此服务器仅用于测试目的。
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 :(得分:0)
尝试将ensureSecurity设置为false,它应该开始工作。
ChannelServices.RegisterChannel(serverChannel, false);
答案 1 :(得分:0)
您已在startServer()中使用以下命令指定安全性是必须的:
ChannelServices.RegisterChannel(serverChannel, true);
然而,'客户端'没有指定安全性,因此授权错误。除非服务器安全设置设置为“false”,否则您需要在两端指定tcp通道安全性。在第二个startNode方法中,在使用Activator.GetObject之前需要执行以下操作,请注意TcpChannel上没有指定端口,这与服务器端不同:
TcpChannel ClientChan = new TcpChannel();
ChannelServices.RegisterChannel(ClientChan, true);
此外,除非你在某些你没有给我们的代码中执行此操作,否则你似乎也没有注册一个众所周知的服务类型服务器端,尽管你说它一直在调试器中工作所以也许这不是必要的情况下。请参阅MSDN on RegisterWellKnownServiceType。