コンテキスト ハンドルのエラー セマンティクス
このトピックでは、コンテキスト ハンドルのエラー セマンティクスについて説明します。
コンテキスト ハンドルを閉じるときに失敗するセマンティクスが失敗する
クライアント アプリケーションが、クライアント プロセスをシャットダウンせずに、サーバー上で開かれたコンテキスト ハンドルを閉じようとしているとします。 また、コンテキスト ハンドルを閉じるサーバーへの呼び出しが失敗したとします (たとえば、クライアントがメモリ不足です)。 この状況を処理する適切な方法は、 RpcSsDestroyClientContext 関数を呼び出す方法です。 このような場合、クライアントはコンテキスト ハンドルの側をクリーンアップし、サーバーへの接続を中止して閉じます。 接続は実際には接続プールであるため ( RPC と Network を参照)、開かれたバインドまたはコンテキスト ハンドルごとに 1 つの参照で参照カウントされるため、 RpcSsDestroyClientContext 関数を呼び出してコンテキスト ハンドルを破棄しても、実際には接続は破棄されません。 代わりに、接続プールの参照カウントをデクリメントします。 プール内の接続を閉じるには、クライアント プロセスからそのサーバーへのすべてのバインド ハンドルとコンテキスト ハンドルを閉じる必要があります。 その後、プール内のすべての接続が閉じられ、サーバーの実行メカニズムが開始され、クリーンアップされます。
コンテキスト ハンドルの状態の変更中のエラー セマンティクス
このセクションの情報は、Windows XP 以降のプラットフォームを参照します。
コンテキスト ハンドルは、単に関数のパラメーターです。 コンテキスト ハンドルの状態のすべての変更は、パラメーターがマーシャリングまたはマーシャリング解除されるときに発生します。 たとえば、クライアントがコンテキスト ハンドルを開いた場合 ( NULL から NULL 以外に変更)、RPC ランタイムは、クライアントに送信するために引数がマーシャリングされるまで、実際にはハンドルの RPC 部分を開きません。 エラーは、中間の間に発生する可能性があります。 さまざまなネットワークまたはリソースの不足状態により、クライアントへのパケットの送信が失敗する可能性があります。 または、サーバー ルーチンがコンテキスト ハンドルの変更中に例外をスローする可能性があります。 このようなエラーが発生した場合、クライアントとサーバーはコンテキスト ハンドルの一貫性のないビューを取得する可能性があります。 このセクションでは、コンテキスト ハンドルの状態に関する規則と、さまざまなエラー状態でのクライアントコードとサーバー コードの責任について説明します。
NULL コンテキスト ハンドルが到着しますが、サーバー ルーチンでエラーが発生し、例外がスローされます。
作成したコンテキスト ハンドル関連の状態をクリーンするのは、サーバー ルーチンの役割です。 RPC ランタイムは、その状態をクリーンアップします。
NULL 以外のコンテキスト ハンドルが到着しますが、サーバー ルーチンでエラーが発生し、例外がスローされます。
サーバー ルーチンがコンテキスト ハンドルを閉じた場合、呼び出しは成功しないため、クライアントはそのことを認識しません。コンテキスト ハンドルをさらに使用すると、クライアントでRPC_X_SS_CONTEXT_MISMATCH エラーが発生します。 サーバー ルーチンがコンテキスト ハンドルを変更しない場合でも、クライアントはそれを使用できます。 サーバー ルーチンがサーバー コンテキストに格納されている情報を変更した場合、クライアントからの新しい呼び出しでは、その情報が使用されます。
NULL 以外のコンテキスト ハンドルが到着すると、サーバー ルーチンはハンドルを閉じますが、コンテキスト ハンドルのマーシャリングが失敗した後にマーシャリングするか、マーシャリングが失敗した後の処理を行います。
コンテキスト ハンドルは閉じられ、このコンテキスト ハンドルを使用してこのクライアントによってさらに呼び出されると、クライアントでRPC_X_SS_CONTEXT_MISMATCH エラーが発生します。
NULL コンテキスト ハンドルが到着すると、サーバーはこのハンドルのコンテキストを作成しますが、コンテキスト ハンドルのマーシャリングが失敗した後にマーシャリングするか、マーシャリングが失敗した後の処理を行います。
この場合、RPC ランタイムは、このコンテキスト ハンドルの実行を呼び出し、このコンテキスト ハンドルの RPC 状態をクリーンアップします。 コンテキスト ハンドルは、クライアント側では作成されません。
NULL 以外のコンテキスト ハンドルが到着すると、サーバーはコンテキスト ハンドルを変更しないか、サーバー コンテキストに格納されている情報を変更し、コンテキスト ハンドルがマーシャリングされた後にマーシャリングが失敗します。
クライアントからの新しい呼び出しでは、サーバーが持っているコンテキスト ハンドルが使用されます。
NULL コンテキスト ハンドルが到着し、サーバーは NULL 以外に設定しませんが、コンテキスト ハンドルがマーシャリングされる前に呼び出しが失敗します。
この場合、クライアントにコンテキスト ハンドルは作成されません。
NULL 以外のコンテキスト ハンドルが到着し、サーバーによって NULL に設定されますが、コンテキスト ハンドルがマーシャリングされる前にマーシャリングが失敗します。
この場合、コンテキスト ハンドルはサーバー上で閉じたままになり、クライアントはコンテキスト ハンドルを使用しようとするとRPC_X_SS_CONTEXT_MISMATCHエラーを受け取ります。
NULL コンテキスト ハンドルがサーバーに到着し、サーバーによって NULL 以外に設定されますが、コンテキスト ハンドルがマーシャリングされる前にマーシャリングが失敗します。
サーバーがクリーンできるようにコンテキスト ハンドルを呼び出し、クライアントにコンテキスト ハンドルを作成しないようにします。
NULL 以外のコンテキスト ハンドルが到着すると、サーバーはコンテキスト ハンドルを変更しないか、サーバー コンテキストに格納されている情報を変更し、コンテキスト ハンドルがマーシャリングされる前にマーシャリングが失敗します。
クライアントからの新しい呼び出しでは、サーバー上の状態が使用されます。
コンテキスト ハンドルは戻り値として宣言され、サーバー ルーチンはコンテキスト ハンドルの NULL を 返し、コンテキスト ハンドルがマーシャリングされる前にマーシャリングが失敗します。
この場合、クライアントに新しいコンテキストは作成されません。
コンテキスト ハンドルは戻り値として宣言され、サーバー ルーチンはコンテキスト ハンドルに対して NULL 以外の値 を返し、コンテキスト ハンドルがマーシャリングされる前にマーシャリングが失敗します。
RPC ランタイムはコンテキスト ハンドルランダウン ルーチンを呼び出してクリーンする機会を与え、クライアントに新しいコンテキストは作成されません。