无法从传输连接读取数据:连接已关闭

时间:2010-05-20 09:53:04

标签: c# .net authentication remoting

例外是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);

        }

2 个答案:

答案 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