Вопрос

Я пишу клиент 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);
.

Я не совсем уверен, что мне пришлось использовать это (казалось бы) нетрадиционным способом.Возможно, это связано с отсутствием службы именования на сервере.Независимо от причины, я надеюсь, что это поможет кому-то там.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top