Usando HTTP como um transporte RPC
O RPC-over-HTTP permite que os programas cliente usem a Internet para executar procedimentos fornecidos por programas de servidor em redes distantes. O RPC por HTTP encapsula suas chamadas por meio de uma porta HTTP estabelecida. Portanto, suas chamadas podem cruzar firewalls de rede nas redes cliente e servidor.
O RPC via HTTP roteia suas chamadas para o proxy RPC localizado na rede do servidor RPC. O Proxy RPC estabelece e mantém uma conexão com o servidor RPC. Ele serve como um proxy, expedindo chamadas de procedimento remoto para o servidor RPC e enviando as respostas do servidor de volta pela Internet para o aplicativo cliente. Esse processo é ilustrado no diagrama a seguir.
O diagrama mostra um firewall na rede do aplicativo cliente. Isso não é necessário para que o RPC por HTTP opere. No entanto, se a rede cliente tiver um firewall, ela também precisará de um programa de servidor proxy, como o Servidor Proxy da Microsoft.
Quando o programa cliente emite uma chamada de procedimento remoto usando HTTP como transporte, a biblioteca de tempo de execução RPC no cliente entra em contato com o proxy RPC. Dependendo se o cliente RPC foi solicitado a usar HTTP ou HTTPS (HTTP com SSL) a porta 80 ou a porta 443 é usada, respectivamente. O proxy RPC entra em contato com o programa de servidor RPC e estabelece uma conexão TCP/IP. O cliente e o proxy RPC mantêm sua conexão HTTP ou HTTPS pela Internet. A conexão HTTP ou HTTPS do cliente com o proxy RPC poderá passar por um firewall (sujeito a permissões de acesso apropriadas) se houver um. Em seguida, o servidor pode executar a chamada de procedimento remoto e usar a conexão por meio do proxy RPC para responder ao cliente. O proxy RPC é uma extensão ISAPI em execução no contexto do IIS.
Se o cliente ou o servidor se desconectar por qualquer motivo, o proxy RPC o detectará e encerrará a sessão RPC. Enquanto a sessão continuar, o proxy RPC manterá suas conexões com o cliente e o servidor. Ele encaminhará chamadas de procedimento remoto do cliente para o servidor e enviará respostas do servidor para o cliente.
O programa cliente RPC pode encapsular suas chamadas RPC pela Internet criando uma associação de cadeia de caracteres do formulário:
[object_uuid@]ncacn_http:rpc_server[endpoint,HttpProxy=proxy_server:http_port,RpcProxy=rpc_proxy:rpc_port,HttpConnectionOption=UseHttpProxy]
Em que:
object_uuid especifica um objeto RPC UUID. Para obter mais informações, consulte Gerando UUIDs de interface e UUID de cadeia de caracteres.
ncacn_http seleciona a especificação de sequência de protocolo para RPC por HTTP. Para obter mais informações, consulte Constantes de sequência de protocolo e Associação de cadeia de caracteres.
rpc_server é o endereço de rede do computador que está executando o processo do servidor RPC. O endereço do servidor deve ser especificado em um formulário visível e compreensível pelo computador proxy RPC, não pelo cliente. Como o cliente não se conecta diretamente ao servidor, ele não precisa ser capaz de resolve o nome do servidor ou estabelecer uma conexão com ele. O proxy RPC estabelecerá a conexão em nome do cliente e, portanto, rpc_server deve ser um nome reconhecível pelo proxy RPC.
O ponto de extremidade especifica a porta TCP/IP que o processo do servidor RPC escuta para chamadas de procedimento remoto. Para obter mais informações, consulte Localizando pontos de extremidade.
O HttpProxy especifica opcionalmente um servidor proxy HTTP na rede do cliente RPC, como o Servidor Proxy da Microsoft. Se um servidor proxy for selecionado, nenhum número de porta será especificado, o stub RPC usará a porta 80 por padrão se o SSL não for solicitado e a porta 443 se o SSL for especificado.
RpcProxy especifica o endereço e o número da porta do computador IIS que atua como um proxy para o servidor RPC. Você só precisará especificar isso se o processo do servidor RPC residir em um computador diferente do proxy RPC. Se você não especificar um número de porta, o stub do cliente RPC por padrão usará a porta 80 se SSL não for especificado e usará a porta 443 se SSL (HTTPS) for especificado.
HttpConnectionOption opcionalmente permite que você direcione o comportamento do RPC ao fazer conexões HTTP. O valor UseHttpProxy instrui o RPC a rotear seu tráfego por meio do proxy Http o tempo todo, incluindo quando o cliente tem suas Opções de Internet definidas na Internet Explorer para "Ignorar o servidor proxy para endereços locais".
Essa opção tem suporte no Windows 7, Windows Server 2008 R2, Windows 8.1 e Windows Server 2012 R2 com KB2916915 instalado. Não há suporte para essa opção em Windows 8 e Windows Server 2012. Os aplicativos podem determinar se essa opção tem suporte pelo runtime do RPC verificando o valor do registro ConnectionOptionsFlag localizado na seguinte chave do Registro:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Rpc
Se o bit 0 (LSB) desse valor do Registro for definido, essa opção específica terá suporte; caso contrário, essa opção não é compatível com o runtime RPC no sistema.
Para obter mais informações sobre como criar associações de cadeia de caracteres, consulte Associação e identificadores.
O programa de servidor RPC pode aceitar chamadas RPC em túnel escutando na sequência de protocolo ncacn_http.
A Microsoft tem duas implementações principais de RPC por HTTP: Versão 1 e Versão 2.
A versão 1 (chamada RPC via HTTP v1) tem suporte por meio do Windows XP. A versão 1 do proxy RPC tem suporte por meio do Windows 2000.
A versão 2 (chamada RPC via HTTP v2) é a versão atual.
As duas versões têm recursos diferentes e interoperabilidade limitada. Um resumo das diferenças é fornecido aqui. Para considerações sobre interoperabilidade, consulte Requisitos do sistema e interoperabilidade para RPC por HTTP.
- O RPC via HTTP v1 requer que o Túnel SSL seja habilitado em todos os proxies/firewalls HTTP entre o cliente RPC por HTTP e o proxy RPC. O RPC sobre HTTP v1 tenta criar um Túnel SSL pela porta 80, embora os dados enviados não sejam, na verdade, criptografados por SSL. Proxies e firewalls geralmente rejeitam essas solicitações, a menos que explicitamente configurados para permitir. O RPC sobre HTTP v2 não tem esse requisito.
- O RPC via HTTP v1 não pode estabelecer uma sessão SSL para o proxy RPC. O RPC via HTTP v2 pode enviar todo o RPC por tráfego HTTP em uma sessão SSL; por padrão, a v2 exige que os dados sejam enviados dentro de uma sessão SSL.
- O RPC via HTTP v1 não pode se autenticar no proxy RPC. O RPC via HTTP v2 pode ser autenticado; por padrão, a v2 requer autenticação para o proxy RPC.
- O proxy RPC v1 não funciona corretamente quando o computador IIS no qual ele está instalado faz parte de um farm da Web. O proxy RPC v2 opera corretamente quando o computador IIS no qual ele está instalado faz parte de um farm da Web.
Observação
Se o Microsoft Internet Explorer estiver instalado no computador do programa cliente e seu cliente não especificar um HttpProxy em sua associação de cadeia de caracteres, o stub do cliente RPC pesquisará no registro no computador cliente uma entrada HttpProxy. Se encontrar um, ele usará o proxy especificado na entrada do Registro.
Suponha, por exemplo, que seu programa cliente precise se conectar pela Internet a um servidor RPC em um computador chamado Server7.microsoft.com. Além disso, suponha que o proxy RPC seja executado no Major7.microsoft.com. O programa de servidor RPC escuta a porta 2225. Seu cliente usaria a associação de cadeia de caracteres:
ncacn_http:Server7.microsoft.com[2225, RpcProxy=Major7.microsoft.com]
Se o proxy RPC puder resolve o nome do servidor como Server7, sem a necessidade de um nome de domínio totalmente qualificado, você também poderá especificar:
ncacn_http:Server7 [2225, RpcProxy=Major7.microsoft.com]
Se a rede cliente usar um firewall e um servidor proxy da Internet chamado myproxy, e a internet Explorer no cliente não estiver configurada para usar esse proxy, você precisará modificar a associação de cadeia de caracteres do cliente para:
ncacn_http:Server7.microsoft.com[,HttpProxy=myproxy:80,RpcProxy=Major7.microsoft.com:80]
Isso orienta o cliente a se conectar ao programa de servidor RPC no Server7.microsoft.com. Para fazer isso, o cliente usará primeiro a porta 80 (ou a porta 443 se o SSL for usado) para se conectar ao myproxy. Isso dará ao programa cliente acesso à Internet. Usando a Internet, o programa cliente se conecta ao proxy RPC em Major7.microsoft.com. O proxy RPC estabelecerá uma conexão com o programa de servidor RPC em execução no Server7.microsoft.com.
Se a rede cliente usar um firewall e se o proxy RPC não puder ser acessado diretamente, para estabelecer uma conexão mais rapidamente, a associação de cadeia de caracteres do cliente poderá ser modificada para:
ncacn_http:Server7.microsoft.com[RpcProxy=Major7.microsoft.com:80,HttpConnectionOption=UseHttpProxy]
O HttpConnectionOption permite que você direcione o comportamento do RPC ao fazer conexões HTTP. O valor UseHttpProxy instrui o RPC a rotear seu tráfego por meio do proxy Http o tempo todo, incluindo quando o cliente tem suas Opções de Internet definidas na Internet Explorer para "Ignorar o servidor proxy para endereços locais". Isso orienta o cliente a se conectar com força ao proxy RPC por meio do proxy Http. Isso acelera o tempo para estabelecer uma conexão, pois ignora qualquer atraso na pesquisa do servidor RPC diretamente antes de usar o proxy HTTP.
Se a opção HttpConnectionOption for usada e a internet Explorer no cliente não estiver configurada para usar esse proxy Http, as conexões poderão falhar com RPC_S_INVALID_NETWORK_OPTIONS.
A grande maioria dos computadores atualmente está configurada para navegação na Web. Portanto, a maioria dos clientes não precisa especificar o HttpProxy, pois ele será recuperado das configurações de conectividade com a Internet.