次の方法で共有


.NET Framework リモート処理アーキテクチャ

このトピックの対象は、既存のアプリケーションとの下位互換性のために残されているレガシ テクノロジに特定されています。新規の開発には、このトピックを適用しないでください。分散アプリケーションは、現在は Windows Communication Foundation (WCF) を使用して開発する必要があります。

.NET リモート処理インフラストラクチャは、プロセス間通信に対する抽象的なアプローチです。値によって渡すことができるオブジェクト、またはコピーできるオブジェクトは、異なるアプリケーション ドメイン内または異なるコンピューター上にあるアプリケーション間で自動的に渡されます。この機能を使用するには、カスタム クラスをシリアル化可能としてマークします。

ただし、リモート処理システムの本当の利点は、異なるトランスポート プロトコル、シリアル化形式、オブジェクト有効期間スキーム、オブジェクト生成モードを使用するさまざまなアプリケーション ドメインやプロセス内にあるオブジェクト間の通信を可能にする点にあります。さらに、リモート処理により、通信プロセスのほぼすべての段階に介入できるようになります。

既に多数の分散アプリケーションを実装している場合でも、コンポーネントを他のコンピューターに移動してプログラムのスケーラビリティを向上させることが目的である場合でも、リモート処理システムはプロセス間通信の汎用システムであり、いくつかの既定の実装を使用するだけでほとんどのシナリオを簡単に処理できると理解することができます。ここでは、リモート処理を使用したプロセス間通信の基礎から説明します。

コピーと参照

プロセス間通信では、プロセスの外部にある呼び出し元に機能を提供するサーバー オブジェクトと、そのサーバー オブジェクトに対して呼び出しを行うクライアント、そして、その呼び出しを一方の端からもう一方の端へ転送するトランスポート機構が必要です。サーバー メソッドのアドレスは論理アドレスであるため、あるプロセス内では正しく機能しても、別のクライアント プロセスでは機能しません。この問題を軽減するために、オブジェクト全体のコピーを作成し、このコピーをクライアント プロセスに移動することにより、クライアントはサーバー オブジェクトを呼び出すことができます。クライアント プロセスでは、コピーしたメソッドを直接呼び出すことができます。

ただし、多くのオブジェクトでは、実行する他のプロセスへのコピーや移動は実行できないか、推奨されません。多数のメソッドが含まれる巨大なオブジェクトは、他のプロセスにコピーしたり、値で渡したりすることが適切ではないこともあります。通常、クライアントに必要なのは、サーバー オブジェクト上の 1 つまたは少数のメソッドから返された情報だけです。クライアントの要件に無関係で、巨大なサイズになることもある内部情報や実行可能構造体も含めてサーバー オブジェクト全体をコピーすることは、クライアントのメモリや処理時間、および帯域幅の無駄になります。また、多くのオブジェクトはパブリックな機能を公開しますが、内部で実行するにはプライベート データが必要です。このようなオブジェクトをコピーすると、承認されていないクライアントが内部データを検証できるようになる可能性があるため、セキュリティの問題の原因となります。さらに、一部のオブジェクトは、通常の方法ではコピーできないデータを使用しています。たとえば FileInfo オブジェクトには、オペレーティング システム ファイルへの参照が含まれており、この参照にはサーバー プロセスのメモリの一意なアドレスが割り当てられています。このアドレスはコピーできますが、他のプロセスでは無効です。

このような状況では、サーバー プロセスはクライアント プロセスに対して、サーバー オブジェクトのコピーではなく、サーバー オブジェクトへの参照を渡す必要があります。クライアントでは、この参照を使用してサーバー オブジェクトを呼び出すことができます。これらの呼び出しは、クライアント プロセスでは実行されません。その代わりに、リモート処理システムは呼び出しに関するすべての情報を収集し、サーバー プロセスに送信します。サーバー プロセスはこの呼び出しを解釈して、正しいサーバー オブジェクトの位置を特定し、クライアント オブジェクトのためにサーバー オブジェクトに対する呼び出しを行います。呼び出しの結果はクライアント プロセスに返され、クライアントに返されます。帯域幅は重要な情報、つまり、呼び出し、呼び出しの引数、および戻り値や例外に対してだけ使用されます。

簡素化されたリモート処理アーキテクチャ

リモート処理の中心は、サーバー オブジェクトとクライアント間の通信でのオブジェクト参照の使用です。ただし、リモート処理アーキテクチャにはより基本的なプログラミング手順が用意されています。クライアントを適切に構成していれば、new (またはマネージ プログラミング言語のインスタンス生成関数) を使用してリモート オブジェクトの新しいインスタンスを生成するだけです。クライアントがサーバー オブジェクトへの参照を受け取った後は、そのオブジェクトが別のコンピューター上で実行中ではなく、プロセス内にあるかのように、そのオブジェクトのメソッドを呼び出すことができます。リモート処理システムは、プロキシ オブジェクトを使用して、サーバー オブジェクトがクライアントのプロセス内にあるかのような状態を作り出します。プロキシは、それ自体が他のオブジェクトであるように見えるオブジェクトです。クライアントでリモート型のインスタンスが生成されると、リモート処理インフラストラクチャでは、クライアントからはそのリモート型とまったく同じに見えるプロキシ オブジェクトが生成されます。クライアントがプロキシ上のメソッドを呼び出すと、リモート処理システムはその呼び出しを受け取ってサーバー プロセスにルーティングし、サーバー オブジェクトを呼び出して、戻り値をクライアントのプロキシに返します。呼び出しの結果は、プロキシからクライアントに返されます。

リモート呼び出しは、クライアントとサーバー プロセス間でなんらかの方法で搬送される必要があります。リモート処理システムを独自に構築する場合は、まず、ネットワーク プログラミングと、さまざまなプロトコルやシリアル化形式の仕様について学習する必要があります。.NET リモート処理システムでは、ネットワーク接続を開いて、バイトを受信側アプリケーションに送信するための特定のプロトコルを使用するために必要な、基礎となる技術の組み合わせが、トランスポート チャネルとして表されます。

チャネルはデータのストリームを受け取る型であり、特定のネットワーク プロトコルに応じてパッケージを生成し、そのパッケージを他のコンピューターに送信します。チャネルには、情報の受信専用のチャネル、情報の送信専用のチャネルに加え、既定の TcpChannel クラスや HttpChannel クラスのように、情報の受信と送信のどちらにも使用できるチャネルなどがあります。

サーバー プロセスはそれぞれの一意な型に関するすべての情報を認識していますが、クライアントは、他のアプリケーション ドメイン、または他のコンピューター上にあるオブジェクトへの参照が必要であることだけを認識しています。サーバー アプリケーション ドメインの外部からは、URL によってオブジェクトの位置が特定されます。外部に対して一意の型を表す URL はアクティベーション URL と呼ばれ、リモート呼び出しが必ず正しい型に対して行われるようにします。詳細については、「アクティベーション URL」を参照してください。

リモート処理システムのデザインの概要

1 台のコンピューター上でアプリケーションを実行しており、別のコンピューター上に格納されている型によって公開されている機能を使用するとします。一般的なリモート処理プロセスを次の図に示します。

.NET リモート処理アーキテクチャ

このリレーションシップの両端が正しく構成されていれば、クライアントではサーバー クラスの新しいインスタンスを生成するだけで済みます。リモート処理システムは、そのクラスを表すプロキシ オブジェクトを生成し、クライアント オブジェクトに対してプロキシへの参照を返します。クライアントがメソッドを呼び出すと、リモート処理インフラストラクチャが呼び出しを処理し、型情報をチェックして、チャネル上でサーバー プロセスに呼び出しを送信します。リッスンしているチャネルは要求をピック アップし、その要求をサーバーのリモート処理システムに転送します。サーバーのリモート処理システムは、要求されたオブジェクトの位置を特定 (必要な場合には生成) して呼び出します。次に、この逆方向の処理が行われ、サーバーのリモート処理システムが応答をメッセージにバンドルし、このメッセージをサーバー チャネルがクライアント チャネルに送信します。最後に、クライアントのリモート処理システムが、呼び出しの結果をプロキシ経由でクライアント オブジェクトに返します。

この作業のために作成が必要な実際のコードはわずかですが、リレーションシップのデザインと構成には検討が必要です。コードが完全に適切であっても、URL やポート番号が間違っているために失敗する可能性があります。詳細については、「構成」を参照してください。

リモート処理プロセスに関する高レベルの概要はかなり単純ですが、低いレベルでの詳細は非常に複雑になる場合があります。リモート処理の主な要素に関する詳細な説明については、次の「関連項目」セクションに示すその他のトピックを参照してください。

参照

概念

境界 : プロセスとアプリケーション ドメイン
リモート処理可能オブジェクトとリモート処理不可能オブジェクト
チャネル
リモート処理でのセキュリティ
リモート アプリケーションの構成

その他のリソース

.NET Framework リモート処理の概要
オブジェクトのアクティベーションと有効期間