Как я могу посмотреть на службу CORBA с C # и IIOP.NET?
-
12-12-2019 - |
Вопрос
Я пишу клиент C # для сервера CORBA, и я использую IIOP.NET, идя по примеру на следующей странице: http://iioop-net.sourceforge.net/rmiadderdnclient.html
Я получил это далеко без ошибок:
// Register channel
IiopClientChannel channel = new IiopClientChannel();
ChannelServices.RegisterChannel(channel, false);
// Access COS naming context
CorbaInit init = CorbaInit.GetInit();
NamingContext context = init.GetNameService(host, port);
.
Переменная «хост» - это строка с именем компьютера сервера и «порт» - это int, представляющий номер порта. Значения для них в настоящее время используются другими системами для подключения к серверу, поэтому я могу подтвердить, что они верны.
Тем не менее, пытаясь подключиться к сервису трейдеров дает исключение во время выполнения. Вот код, который я использую для этого:
// Looking up VB Trader
NameComponent[] names = new NameComponent[] { new NameComponent("TraderInterface") };
object obj = context.resolve(names);
.
А вот сообщение об ошибке я получаю:
"Исключение системы CORBA: OMG.ORG.CORBA.INV_OBJREF, завершено: завершено несовершеннолетние: 10102."
Это, кажется, предлагает неверный ссылку на объект, но что это значит? Является ли строка, которую я передаю в метод разрешения неправильно отформатирован? Я пробовал много разных имен для этой услуги, используемой в других системах, но я всегда получаю ту же ошибку, что заставляет меня задуматься, даже ли я правильно интерпретирую это.
Кстати, в моем отчаянии я также попытался получить ссылку на объект от IOR, но это снова бросает другое исключение (а именно OMG.ORG.corba.orb_package.invalidname).
OrbServices orb = OrbServices.GetSingleton();
object obj = orb.resolve_initial_references(traderIOR);
.
Любой совет приветствуется.
Решение
Я никогда не смог добраться до моего сервера с любым из вышеперечисленных методов, однако следующий код - это то, что, наконец, получил работу связи:
Hashtable props = new Hashtable();
props[IiopChannel.BIDIR_KEY] = true;
props[IiopServerChannel.PORT_KEY] = port;
// register corba services
IiopChannel channel = new IiopChannel(props);
ChannelServices.RegisterChannel(channel, false);
MyInterface obj = (MyInterface)RemotingServices.Connect(typeof(MyInterface), ior);
.
Я не совсем уверен, что мне пришлось использовать это (казалось бы) нетрадиционным способом.Возможно, это связано с отсутствием службы именования на сервере.Независимо от причины, я надеюсь, что это поможет кому-то там.