RPC トランスポートとしての HTTP の使用

RPC over-HTTP を使用すると、クライアント プログラムはインターネットを使用して、離れたネットワーク上のサーバー プログラムによって提供されるプロシージャを実行できます。 RPC over HTTP は、確立された HTTP ポートを介してその呼び出しをトンネリングします。 したがって、その呼び出しは、クライアント ネットワークとサーバー ネットワークの両方でネットワーク ファイアウォールを通過する可能性があります。

RPC over HTTP は、その呼び出しを RPC サーバーのネットワーク上にある RPC プロキシにルーティングします。 RPC プロキシは、RPC サーバーへの接続を確立して維持します。 プロキシとして機能し、リモート プロシージャ コールを RPC サーバーにディスパッチし、サーバーの応答をインターネット経由でクライアント アプリケーションに送信します。 このプロセスを次の図に示します。

rpc サーバーとインターネット情報サーバーの間の相互作用 (rpc http)

この図は、クライアント アプリケーションのネットワーク上のファイアウォールを示しています。 これは、RPC over HTTP が動作するために必要ありません。 ただし、クライアント ネットワークにファイアウォールがある場合は、Microsoft プロキシ サーバーなどのプロキシ サーバー プログラムも必要です。

クライアント プログラムが HTTP を使用してリモート プロシージャ コールをトランスポートとして発行すると、クライアント上の RPC ランタイム ライブラリが RPC プロキシに接続します。 RPC クライアントが HTTP または HTTPS (SSL を使用した HTTP) ポート 80 またはポート 443 のどちらを使用するように求められたかに応じて、それぞれが使用されます。 RPC プロキシは RPC サーバー プログラムに接続し、TCP/IP 接続を確立します。 クライアントと RPC プロキシは、インターネット経由で HTTP または HTTPS 接続を維持します。 RPC プロキシへのクライアントの HTTP または HTTPS 接続は、ファイアウォール (適切なアクセス許可の対象) を通過できます (存在する場合)。 その後、サーバーはリモート プロシージャ コールを実行し、RPC プロキシ経由の接続を使用してクライアントに応答できます。 RPC プロキシは、IIS のコンテキストで実行されている ISAPI 拡張機能です。

何らかの理由でクライアントまたはサーバーのいずれかが切断された場合、RPC プロキシはそれを検出し、RPC セッションを終了します。 セッションが続行される限り、RPC プロキシはクライアントとサーバーへの接続を維持します。 クライアントからサーバーにリモート プロシージャ コールを転送し、サーバーからクライアントに応答を送信します。

RPC クライアント プログラムは、次の形式の文字列バインディングを作成することで、インターネット経由で RPC 呼び出しをトンネリングできます。

[object_uuid@]ncacn_http:rpc_server[endpoint,HttpProxy=proxy_server:http_port,RpcProxy=rpc_proxy:rpc_port,HttpConnectionOption=UseHttpProxy]

この場合、

  • object_uuid RPC オブジェクト UUID を指定します。 詳細については、「 インターフェイス UUID の生成 」と 「文字列 UUID」を参照してください

  • ncacn_http は、RPC over HTTP のプロトコル シーケンス仕様を選択します。 詳細については、「 プロトコル シーケンス定数 」と「 文字列バインディング」を参照してください。

  • rpc_server は、RPC サーバー プロセスを実行しているコンピューターのネットワーク アドレスです。 サーバー アドレスは、クライアントではなく、RPC プロキシ コンピューターで表示および理解できる形式で指定する必要があります。 クライアントはサーバーに直接接続しないため、サーバーの名前を解決したり、サーバーへの接続を確立したりできる必要はありません。 RPC プロキシはクライアントの代わりに接続を確立するため、 rpc_server は RPC プロキシによって認識可能な名前である必要があります。

  • エンドポイント は、RPC サーバー プロセスがリモート プロシージャ コールをリッスンする TCP/IP ポートを指定します。 詳細については、「エンドポイントの 検索」を参照してください。

  • HttpProxy は、必要に応じて、RPC クライアントのネットワーク上の HTTP プロキシ サーバー (Microsoft プロキシ サーバーなど) を指定します。 プロキシ サーバーが選択されている場合、ポート番号は指定されません。RPC スタブでは、SSL が要求されていない場合は既定でポート 80 が使用され、SSL が指定されている場合はポート 443 が使用されます。

  • RpcProxy は、RPC サーバーへのプロキシとして機能する IIS コンピューターのアドレスとポート番号を指定します。 RPC サーバー プロセスが RPC プロキシとは異なるコンピューターに存在する場合にのみ、これを指定する必要があります。 ポート番号を指定しない場合、既定では、RPC クライアント スタブでは SSL が指定されていない場合はポート 80 が使用され、SSL (HTTPS) が指定されている場合はポート 443 が使用されます。

  • HttpConnectionOption を使用すると、必要に応じて、HTTP 接続を行うときに RPC の動作を指示できます。 UseHttpProxy 値は、クライアントがインターネット エクスプローラーで [ローカル アドレスのプロキシ サーバーをバイパスする] に設定されている場合など、常に HTTP プロキシ経由でトラフィックをルーティングするように RPC に指示します。

    このオプションは、KB2916915 がインストールされている Windows 7、Windows Server 2008 R2、Windows 8.1、および Windows Server 2012 R2 でサポートされています。 このオプションは、Windows 8およびWindows Server 2012ではサポートされていません。 アプリケーションは、次のレジストリ キーの下にある ConnectionOptionsFlag レジストリ値を確認することで、RPC ランタイムでこのオプションがサポートされているかどうかを判断できます。

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Rpc

    このレジストリ値のビット 0 (LSB) が設定されている場合は、この特定のオプションがサポートされます。それ以外の場合、このオプションはシステム内の RPC ランタイムではサポートされません。

文字列バインディングの作成の詳細については、「 バインドとハンドル」を参照してください。

RPC サーバー プログラムは、ncacn_http プロトコル シーケンスをリッスンすることで、トンネリングされた RPC 呼び出しを受け入れます。

Microsoft には、RPC over HTTP の 2 つの主要な実装 (バージョン 1 とバージョン 2) があります。

バージョン 1 (RPC over HTTP v1 と呼ばれます) は、Windows XP でサポートされています。 RPC プロキシのバージョン 1 は、Windows 2000 でサポートされています。

バージョン 2 (RPC over HTTP v2 と呼ばれます) が現在のバージョンです。

2 つのバージョンでは、機能が異なり、相互運用性が制限されています。 相違点の概要については、こちらを参照してください。 相互運用性に関する考慮事項については、「 HTTP 経由の RPC のシステム要件と相互運用性」を参照してください。

  • RPC over HTTP v1 では、RPC over HTTP クライアントと RPC プロキシの間のすべての HTTP プロキシ/ファイアウォールで SSL トンネリングを有効にする必要があります。 RPC over HTTP v1 は、送信するデータが実際には SSL で暗号化されていない場合でも、ポート 80 経由で SSL トンネルを構築しようとします。 プロキシとファイアウォールは、許可するように明示的に構成されていない限り、通常、このような要求を拒否します。 RPC over HTTP v2 には、このような要件はありません。
  • RPC over HTTP v1 では、RPC プロキシへの SSL セッションを確立できません。 RPC over HTTP v2 は、SSL セッション内のすべての RPC over HTTP トラフィックを送信できます。既定では v2 では、SSL セッション内でデータを送信する必要があります。
  • RPC over HTTP v1 は RPC プロキシに対して認証できません。 RPC over HTTP v2 は認証できます。既定では、v2 では RPC プロキシへの認証が必要です。
  • RPC プロキシ v1 がインストールされている IIS マシンが Web ファームの一部である場合、正しく動作しません。 RPC プロキシ v2 は、インストールされている IIS マシンが Web ファームの一部である場合に適切に動作します。

Note

クライアント プログラムのコンピューターに Microsoft Internet エクスプローラーがインストールされていて、クライアントが文字列バインディングで HttpProxy を指定していない場合、RPC クライアント スタブはクライアント コンピューターのレジストリで HttpProxy エントリを検索します。 見つかると、レジストリ エントリで指定されたプロキシが使用されます。

 

たとえば、クライアント プログラムがインターネット経由で、Server7.microsoft.com というコンピューター上の RPC サーバーに接続する必要があるとします。 さらに、RPC プロキシが Major7.microsoft.com で実行されるとします。 RPC サーバー プログラムはポート 2225 をリッスンします。 クライアントは文字列バインディングを使用します。

ncacn_http:Server7.microsoft.com[2225, RpcProxy=Major7.microsoft.com]

RPC プロキシがサーバー名を Server7 として解決できる場合は、完全修飾ドメイン名を必要とせずに、次を指定することもできます。

ncacn_http:Server7 [2225, RpcProxy=Major7.microsoft.com]

クライアント ネットワークがファイアウォールと myproxy というインターネット プロキシ サーバーを使用し、クライアント上のインターネット エクスプローラーがそのプロキシを使用するように構成されていない場合は、クライアントの文字列バインディングを次のように変更する必要があります。

ncacn_http:Server7.microsoft.com[,HttpProxy=myproxy:80,RpcProxy=Major7.microsoft.com:80]

これにより、クライアントは、Server7.microsoft.com 上の RPC サーバー プログラムに接続するように指示されます。 これを行うには、クライアントは最初にポート 80 (または SSL が使用されている場合はポート 443) を使用して myproxy に接続します。 これにより、クライアント プログラムはインターネットにアクセスできるようになります。 次に、クライアント プログラムはインターネットを使用して、Major7.microsoft.com 上の RPC プロキシに接続します。 RPC プロキシは、Server7.microsoft.com で実行されている RPC サーバー プログラムへの接続を確立します。

クライアント ネットワークがファイアウォールを使用していて、RPC プロキシに直接到達できない場合は、接続をより高速に確立するために、クライアント文字列バインディングを次のように変更できます。

ncacn_http:Server7.microsoft.com[RpcProxy=Major7.microsoft.com:80,HttpConnectionOption=UseHttpProxy]

HttpConnectionOption を使用すると、HTTP 接続を行うときに RPC の動作を指示できます。 UseHttpProxy 値は、クライアントがインターネット エクスプローラーで [ローカル アドレスのプロキシ サーバーをバイパスする] に設定されている場合など、常に HTTP プロキシ経由でトラフィックをルーティングするように RPC に指示します。 これにより、クライアントは Http プロキシを介して RPC プロキシに強制的に接続します。 これにより、HTTP プロキシを使用する前に RPC サーバーを直接検索する遅延がバイパスされるため、接続を確立する時間が短縮されます。

HttpConnectionOption オプションを使用し、クライアント上のインターネット エクスプローラーがその Http プロキシを使用するように構成されていない場合、接続がRPC_S_INVALID_NETWORK_OPTIONSで失敗する可能性があります。

現在のコンピューターの大部分は、Web ブラウズ用に構成されています。 そのため、ほとんどのクライアントは、インターネット接続の設定から取得されるため、 HttpProxy を指定する必要はありません。