使用 HTTP 作为 RPC 传输

RPC-over-HTTP 使客户端程序能够使用 Internet 在远程网络上执行服务器程序提供的过程。 RPC over HTTP 通过已建立的 HTTP 端口隧道其调用。 因此,其调用可以在客户端和服务器网络上跨网络防火墙。

RPC over HTTP 路由到 RPC 服务器网络上的 RPC 代理的调用。 RPC 代理建立和维护与 RPC 服务器的连接。 它充当代理,将远程过程调用调度到 RPC 服务器,并通过 Internet 将服务器的回复发送回客户端应用程序。 下图演示了此过程。

rpc 服务器与用于 rpc http 的 Internet 信息服务器之间的交互

此图显示了客户端应用程序网络上的防火墙。 通过 HTTP 的 RPC 不需要此操作即可运行。 但是,如果客户端网络具有防火墙,则还需要代理服务器程序,例如 Microsoft 代理服务器。

当客户端程序使用 HTTP 作为传输发出远程过程调用时,客户端上的 RPC 运行时库会联系 RPC 代理。 根据是要求 RPC 客户端使用 HTTP 还是 HTTPS (HTTP 和 SSL) 分别使用端口 80 或端口 443。 RPC 代理联系 RPC 服务器程序并建立 TCP/IP 连接。 客户端和 RPC 代理通过 Internet 维护其 HTTP 或 HTTPS 连接。 客户端与 RPC 代理的 HTTP 或 HTTPS 连接可以通过防火墙传递, (需要适当的访问权限) (如果存在)。 然后,服务器可以执行远程过程调用,并通过 RPC 代理使用连接来回复客户端。 RPC 代理是在 IIS 上下文中运行的 ISAPI 扩展。

如果客户端或服务器出于任何原因断开连接,RPC 代理将检测到它并结束 RPC 会话。 只要会话继续,RPC 代理就会保持其与客户端和服务器的连接。 它将远程过程调用从客户端转发到服务器,并从服务器向客户端发送答复。

RPC 客户端程序可以通过创建格式的字符串绑定,通过 Internet 通过隧道传输其 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 代理可识别的名称。

  • endpoint 指定 RPC 服务器进程侦听远程过程调用的 TCP/IP 端口。 有关详细信息,请参阅 查找终结点

  • HttpProxy 可选地指定 RPC 客户端网络上的 HTTP 代理服务器,例如 Microsoft 代理服务器。 如果选择了代理服务器,则未指定任何端口号,如果未请求 SSL,则 RPC 存根默认使用端口 80;如果指定了 SSL,则使用端口 443。

  • RpcProxy 指定充当 RPC 服务器的代理的 IIS 计算机的地址和端口号。 仅当 RPC 服务器进程驻留在与 RPC 代理不同的计算机上时,才需要指定此项。 如果未指定端口号,则 RPC 客户端存根默认使用端口 80(如果未指定 SSL),如果指定了 SSL (HTTPS) ,则使用端口 443。

  • HttpConnectionOption (可选)允许你在建立 HTTP 连接时指示 RPC 的行为。 UseHttpProxy 值指示 RPC 始终通过 Http 代理路由其流量,包括客户端在 Internet Explorer 中将其 Internet 选项设置为“绕过本地地址的代理服务器”时。

    安装 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 通过 HTTP 实现 RPC 有两个主要实现:版本 1 和版本 2。

Windows XP 支持版本 1 (名为 RPC over HTTP v1) 。 Windows 2000 支持 RPC 代理的版本 1。

版本 2 (称为 RPC over HTTP v2) 是当前版本。

这两个版本具有不同的功能和有限的互操作性。 此处提供了差异的摘要。 有关互操作性注意事项,请参阅 RPC over HTTP 的系统要求和互操作性

  • 基于 HTTP v1 的 RPC 要求在基于 HTTP 客户端的 RPC 与 RPC 代理之间的所有 HTTP 代理/防火墙上启用 SSL 隧道。 RPC over HTTP v1 尝试通过端口 80 生成 SSL 隧道,即使它发送的数据实际上不是 SSL 加密的。 除非显式配置为允许这些请求,否则代理和防火墙通常会拒绝此类请求。 RPC over HTTP v2 没有此类要求。
  • RPC over HTTP v1 无法建立与 RPC 代理的 SSL 会话。 RPC over HTTP v2 可以在 SSL 会话中通过 HTTP 流量发送所有 RPC;默认情况下,v2 要求在 SSL 会话中发送数据。
  • RPC over HTTP v1 无法向 RPC 代理进行身份验证。 RPC over HTTP v2 可以进行身份验证;默认情况下,v2 需要对 RPC 代理进行身份验证。
  • 当安装它的 IIS 计算机是 Web 场的一部分时,RPC 代理 v1 无法正常运行。 当安装它的 IIS 计算机是 Web 场的一部分时,RPC 代理 v2 将正常运行。

注意

如果 Microsoft Internet Explorer 安装在客户端程序的计算机上,并且客户端未在其字符串绑定中指定 HttpProxy ,则 RPC 客户端存根将在客户端计算机上的注册表中搜索 HttpProxy 条目。 如果找到一个,它将使用注册表项中指定的代理。

 

例如,假设客户端程序需要通过 Internet 连接到名为 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 的防火墙和 Internet 代理服务器,并且客户端上的 Internet Explorer 未配置为使用该代理,则需要将客户端的字符串绑定修改为:

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

这会指示客户端连接到 Server7.microsoft.com 上的 RPC 服务器程序。 为此,客户端将首先使用端口 80 (或端口 443(如果使用 SSL) 连接到 myproxy)。 这将允许客户端程序访问 Internet。 接下来,客户端程序使用 Internet 连接到 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 值指示 RPC 始终通过 Http 代理路由其流量,包括客户端在 Internet Explorer 中将其 Internet 选项设置为“绕过本地地址的代理服务器”时。 这会指示客户端通过 Http 代理强制连接到 RPC 代理。 这加快了建立连接的时间,因为它绕过了在使用 HTTP 代理之前对 RPC 服务器的任何延迟搜索。

如果使用 HttpConnectionOption 选项,并且客户端上的 Internet Explorer 未配置为使用该 Http 代理,则连接可能会失败并 RPC_S_INVALID_NETWORK_OPTIONS

目前绝大多数计算机都配置为用于 Web 浏览。 因此,大多数客户端不需要指定 HttpProxy,因为它将从 Internet 连接设置中检索。