サーバー アクティベーション
このトピックの対象は、既存のアプリケーションとの下位互換性のために残されているレガシ テクノロジに特定されています。新規の開発には、このトピックを適用しないでください。分散アプリケーションは、現在は Windows Communication Foundation (WCF) を使用して開発する必要があります。
サーバー側でアクティブ化されるオブジェクトでは、有効期間をサーバーが直接制御します。サーバー アプリケーション ドメインがこのようなオブジェクトを作成するのは、クライアントが new (Visual Basic では New()) または Activator.GetObject を呼び出す場合ではなく、クライアントがオブジェクトのメソッド呼び出しを行う場合のみです。これにより、インスタンスの作成だけを目的とするネットワーク ラウンド トリップが削減されます。サーバー側でアクティブ化される型のインスタンスをクライアントが要求すると、クライアント アプリケーション ドメインにはプロキシのみが作成されます。これは、サーバー側でアクティブ化される型に対して許可されるのは既定のコンストラクターのみであることを意味します。引数を受け取る特定のコンストラクターでインスタンスが作成される型を発行するには、クライアント アクティベーションを使用するか、特定のインスタンスを動的に発行します。
サーバー アクティベーション モード
サーバー側でアクティブ化されるオブジェクトのアクティベーション モード (つまり、WellKnownObjectMode の値) には、Singleton と SingleCall の 2 つの型があります。
Singleton 型は、同時に複数のインスタンスを持つことはできません。インスタンスが存在している場合、すべてのクライアント要求はそのインスタンスによって処理されます。インスタンスが存在しない場合、サーバーがインスタンスを生成し、後続のクライアント要求はすべてそのインスタンスによって処理されます。Singleton 型には関連付けられた既定の有効期間があるため、同時に使用できるインスタンスが複数存在することはなくても、クライアントは、リモート処理可能なクラスの同じインスタンスへの参照を常に受け取るわけではありません。
SingleCall 型は、クライアント要求ごとに常に 1 つのインスタンスを持ちます。前のインスタンスがシステムでリサイクルされていない場合でも、次のメソッド呼び出しは別のサーバー インスタンスによって処理されます。SingleCall 型は、有効期間リース システムに参加しません。
サーバー側でアクティブ化される型のインスタンスを生成するために、クライアントは、プログラムまたは構成ファイルを使用してアプリケーションを構成します。プログラムでアプリケーションを構成する場合は、サーバー側でアクティブ化されるオブジェクトをインスタンス化する Activator.GetObject メソッドをクライアント側で使用します。構成ファイルでアプリケーションを構成する場合は、Activator.GetObject を呼び出すか、サーバー側でアクティブ化されるオブジェクトをインスタンス化する新しい演算子をクライアント側で使用します。
注 : |
---|
クライアント側でチャネルを登録する必要がない場合があります。クライアントがチャネルを登録しない場合、リモート処理システムは、Machine.config ファイルに指定された既定のチャネルの 1 つを使用して自動的にチャネルを作成し、送信要求を行います。クライアント側でのチャネルの自動選択では、サーバーからのコールバック関数をリッスンするチャネルを登録しません。また、カスタム チャネルを machine.config ファイルに追加しない場合は、カスタム チャネル実装は登録されません。この場合、クライアント アプリケーション ドメインで使用するチャネルの種類を登録する必要があります。 |
Activator.GetObject を呼び出すコード例を次に示します。ここでは、TcpChannel がポート 8080 で通信するように登録されていることを前提としています。サーバー オブジェクトが特定のインターフェイスを実装していることのみをクライアントが認識している場合は、クラスのインスタンスの生成に使用できるのが new (Visual Basic では New) のみとなるため、Activator.GetObject への呼び出しを使用する必要があります。
Dim MyRemoteClass As RemoteObjectClass = _
CType( _
Activator.GetObject(GetType(RemoteObjectClass), _
"tcp://computername:8080/RemoteObjectUri" ), _
RemoteObjectClass
)
RemoteObjectClass MyRemoteClass = (RemoteObjectClass)Activator.GetObject(
typeof(RemoteObjectClass),
"tcp://computername:8080/RemoteObjectUri "
);
この時点では、サーバーとの実際の通信は行われていないので、リモート オブジェクト自体はインスタンス化されていないことに注意してください。インスタンス化されているのは、クライアント側のプロキシ オブジェクトです。ここでクライアントはリモート オブジェクトを直接参照する場合と同様に MyRemoteClass
を使用できます。メソッド呼び出しのたびにクライアントが実際に通信に使用する RemoteObjectClass インスタンスは、サーバー オブジェクトが Singleton 型として宣言されているか、SingleCall 型として宣言されているかによって異なります。サーバー オブジェクトのパブリッシャーがこの情報を公開するかどうかにかかわらず、クライアントはまったく同じオブジェクト参照を処理します。
シングルトン
COM では、"シングルトン" は、クライアントがオブジェクトへの参照を持つ限り、オブジェクトがメモリから削除されないことを意味します。しかし、.NET リモート処理では、Singleton オブジェクトは指定された有効期間リースに従い、クライアントが現在オブジェクトへの参照を保持している場合でもリサイクルされます。COM の場合の Singleton オブジェクトを作成するには、MarshalByRefObject の InitializeLifetimeService メソッドをオーバーライドして、null 参照 (Visual Basic では Nothing) を返します。これにより、ホスト アプリケーション ドメインが稼働している限り、実質上オブジェクトがメモリ内に保持されます。詳細については、「有効期間リース」を参照してください。.NET リモート処理の場合の Singleton オブジェクトを作成するには、リモート処理の構成ファイルに初期リース期間を構成します。
参照
リファレンス
WellKnownObjectMode Enumeration