次の方法で共有


コンテキスト ハンドル

分散アプリケーションでは、クライアント呼び出し間で状態情報を維持するためにサーバー プログラムが必要になることがあります。 一度に複数のクライアントにサービスを提供するサーバー プログラムは、各クライアントの状態情報を保持する必要があります。 クライアントとサーバーは異なるコンピューター上で異なるアドレス空間を使用し、必ずしも相互に信頼するわけではないため、データ共有に対する一般的なアプローチは機能しないことがよくあります。 たとえば、クライアントとサーバーは、同じグローバル アドレス空間を共有していないため、リモート セッションの状態情報をグローバル変数に保持できません。 情報は異なるコンピューターで実行されるため、共有ファイルに保持することは困難です。 単純な方法は、すべての状態をクライアントに出荷し、クライアントに次回の呼び出しで返してもらう場合がありますが、この方法には欠陥があります。サーバーは、クライアントが正しい状態を返すとは限らず、ファイル ハンドルや開かれたソケットなど、サーバー上の他の状態に暗黙的に関連付けられている可能性があります。

Microsoft RPC は、サーバー上の特定のクライアントに関連付けられた状態を維持するためのコンテキスト ハンドルと呼ばれる強力で安全なメカニズムを提供します。 状態情報は、サーバーのコンテキストと呼ばれます。 クライアントはコンテキスト ハンドルを取得して、個々の RPC セッションのサーバーのコンテキストを識別できます。

たとえば、分散アプリケーション内の各クライアントは、サーバー プログラムで RPC セッションのデータ ファイルを作成および更新できます。 サーバーは、各クライアントのデータ ファイルのファイル ハンドルをコンテキスト ハンドルとして使用できます。 クライアントは、サーバーが作成するデータ ファイルに対する操作を要求するたびに、コンテキスト ハンドルをサーバーに渡します。 クライアントは実際にはファイル ハンドル自体を取得しません。サーバー RPC ランタイムがファイル ハンドルに一意に関連付けることができる不透明なトークンを取得します。 コンテキスト ハンドルは実際にはファイル ハンドルであるため、コンテキスト ハンドルはサーバーのアドレス空間でのみ意味があります。 ただし、クライアント プログラムはコンテキスト ハンドルを使用して、更新を実行するファイルをサーバーに指示できます。

その他のデータは、コンテキスト ハンドルにすることもできます。 たとえば、クライアントとサーバーは、データベース レコードのレコード番号をファイル ハンドルとして使用できます。 クライアントが特定のレコードに対して多数の更新を実行する必要がある場合は、レコード番号をコンテキスト ハンドルとして取得できます。 データベース レコードを更新するリモート プロシージャを呼び出すたびに、レコード番号がサーバーに渡されます。

ほとんどの場合、コンテキスト ハンドルは、サーバーがさまざまな管理情報を保持するサーバー上のメモリ ブロックを指します。

このセクションでは、コンテキスト ハンドルの定義と使用について説明します。 ここでは、次のトピックについて説明します。