【问题标题】:Unable to read data from the transport connection: the connection was closed无法从传输连接读取数据:连接已关闭
【发布时间】:2010-05-20 09:53:04
【问题描述】:

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

我在创建两个可以在 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 用于 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);

        }

【问题讨论】:

    标签: c# .net authentication remoting


    【解决方案1】:

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

    【讨论】:

    • 是的,但是如果我们想要启用安全性怎么办?
    【解决方案2】:

    您已在 startServer() 中指定了远程处理服务器上的安全性:

    ChannelServices.RegisterChannel(serverChannel, true); 
    

    但“客户端”端没有指定安全性,因此出现授权错误。除非服务器安全设置设置为“假”,否则您需要在两端指定 tcp 通道安全性。在您的第二个 startNode 方法中,您需要在使用 Activator.GetObject 之前执行以下操作,注意 TcpChannel 上没有指定与服务器端不同的端口:

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

    此外,除非你在一些你没有给我们的代码中这样做,否则你似乎也没有注册一个众所周知的服务类型服务器端,尽管你说它一直在调试器中工作,所以也许那不是在这种情况下是必要的。见MSDN on RegisterWellKnownServiceType。

    【讨论】:

      猜你喜欢
      • 2015-01-15
      • 2017-07-19
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      • 2023-01-11
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      相关资源
      最近更新 更多