Невозможно прочитать данные из транспортного соединения: соединение было закрыто - PullRequest
4 голосов
/ 20 мая 2010

Исключением является исключение удаленного взаимодействия - ошибка аутентификации. В подробном сообщении говорится: «Невозможно прочитать данные из транспортного соединения: соединение было закрыто».

У меня проблемы с созданием двух простых серверов, которые могут взаимодействовать как удаленные объекты в 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);

        }

Ответы [ 2 ]

0 голосов
/ 11 января 2012

Вы указали, что безопасность на вашем удаленном сервере обязательна в startServer () с:

ChannelServices.RegisterChannel(serverChannel, true); 

Тем не менее, клиентский конец не указывает безопасность, следовательно, ошибка авторизации. Необходимо указать безопасность канала tcp на обоих концах, если для параметра безопасности сервера не установлено значение «false». Во втором методе startNode перед использованием Activator.GetObject необходимо сделать следующее. Обратите внимание, что порт TcpChannel не указан, в отличие от конца сервера:

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

Кроме того, если вы не делаете это в каком-то коде, который вы нам не предоставили, вы также, похоже, не зарегистрировали хорошо известный тип службы на стороне сервера, хотя вы говорите, что он работает в отладчике, так что, возможно, это не необходимо по делу. См. MSDN в RegisterWellKnownServiceType .

0 голосов
/ 02 июня 2011

Попробуйте установить false для параметра secureSecurity, и он должен начать работать.
ChannelServices.RegisterChannel(serverChannel, false);

...