1

私は Corba サーバー用の C# クライアントを作成しており、IIOP.NET を使用しています。次のページの例を参照してください: http://iiop-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);

変数 "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、完了: Completed_No マイナー: 10102。」

これは無効なオブジェクト参照を示唆しているように見えますが、それはどういう意味ですか? resolve メソッドに渡す文字列の形式が正しくありませんか? 他のシステムで使用されているように、このサービスにさまざまな名前を付けてみましたが、常に同じエラーが発生するため、正しく解釈しているかどうかさえ疑問に思います。

ちなみに、必死になって、IOR からオブジェクト参照を取得しようとしましたが、これも別の例外 (つまり、omg.org.CORBA.ORB_package.InvalidName) をスローします。

OrbServices orb = OrbServices.GetSingleton();
object obj = orb.resolve_initial_references(traderIOR);

どんなアドバイスでも大歓迎です。

4

1 に答える 1

2

上記の方法のいずれでもサーバーに到達できませんでしたが、次のコードによって最終的に通信が機能しました。

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);

なぜこの(一見)型にはまらない方法を使用しなければならなかったのか、完全にはわかりません。おそらく、サーバー上で実行されているネーム サービスが不足していることが原因です。原因が何であれ、これが誰かの役に立てば幸いです。

于 2012-06-15T13:11:04.303 に答える