Criando um cliente
A criação de um cliente para serviços Web é muito simplificada no WWSAPI pela API do Modelo de Serviço e pela ferramenta WsUtil.exe . O Modelo de Serviço fornece uma API que permite que o cliente envie e receba mensagens por um canal como chamadas de método C. A ferramenta WsUtil gera cabeçalhos e auxiliares para implementar o cliente. Esses cabeçalhos incluem os tipos e protótipos de função para funções C que representam os serviços oferecidos pelo serviço Web de destino. Os auxiliares são usados para criar o proxy de serviço, que contém as informações de associação e o endereço do ponto de extremidade para o serviço.
Usando o WsUtil para gerar cabeçalhos e auxiliares
Para gerar os cabeçalhos e auxiliares, o WsUtil abre e lê os arquivos de metadados para o serviço de destino — arquivos wsdl e xsd — e os converte em cabeçalhos; portanto, é necessário recuperar os arquivos de metadados para o serviço de destino com antecedência, por exemplo, usando o SvcUtil, uma parte do Windows Communication Foundation. Por motivos de segurança, é imperativo que suas cópias desses arquivos sejam confiáveis. (Para obter mais informações, consulte a seção "Segurança" do tópico Ferramenta do Compilador WsUtil .)
Para executar o WsUtil, use a seguinte sintaxe de linha de comando se os arquivos WSDL e XSD para o serviço estiverem em seu próprio diretório: WsUtil.exe *.wsdl *.xsd
. Como alternativa, você pode especificar os arquivos por nome completo.
O WsUtil geralmente gera dois arquivos para cada arquivo de metadados: um cabeçalho e um arquivo C. Adicione esses arquivos ao projeto de codificação e use #include instruções para incluí-los no código do cliente. (Os arquivos XSD representam tipos e os arquivos WSDL representam operações.)
Criando o Proxy de Serviço
O cabeçalho gerado pelo WsUtil contém uma rotina auxiliar para criar o proxy de serviço com a associação necessária. Essa rotina está incluída na seção "Rotinas auxiliares da política" do arquivo de cabeçalho gerado. Por exemplo, o cabeçalho gerado para o serviço de calculadora ilustrado no exemplo httpcalculatorclientexample conterá o protótipo de função a seguir.
HRESULT BasicHttpBinding_ICalculator_CreateServiceProxy(
__in_opt WS_HTTP_BINDING_TEMPLATE* templateValue,
__in_ecount_opt(proxyPropertyCount) const WS_PROXY_PROPERTY* proxyProperties,
__in const ULONG proxyPropertyCount,
__deref_out_opt WS_SERVICE_PROXY** _serviceProxy,
__in_opt WS_ERROR* error);
Incorpore esse auxiliar em seu código e passe um identificador de WS_SERVICE_PROXY para receber o identificador para o proxy de serviço criado. No cenário mais simples, no qual apenas um identificador de proxy de serviço e um objeto de erro são passados para a função, a chamada é semelhante à seguinte.
hr = BasicHttpBinding_ICalculator_CreateServiceProxy(
NULL,
NULL,
0,
&serviceProxy,
error);
Para criar a parte de endereço do proxy de serviço, chame WsOpenServiceProxy com um identificador para o proxy de serviço e um ponteiro para um WS_ENDPOINT_ADDRESS que contém o endereço do ponto de extremidade de serviço ao qual você deseja se conectar.
Implementando o cliente com protótipos de função
Os cabeçalhos gerados a partir dos arquivos WSDL de serviço também contêm protótipos de função C que representam os serviços disponíveis do serviço Web e específicos para a associação necessária. Por exemplo, um cabeçalho gerado para o serviço de calculadora ilustrado em HttpCalculatorServiceExample conterá o protótipo a seguir para a operação de multiplicação desse serviço.
HRESULT BasicHttpBinding_ICalculator_Multiply(
__in WS_SERVICE_PROXY* _serviceProxy,
__in double n1,
__in double n2,
__out double* MultiplyResult,
__in WS_HEAP* _heap,
__in_ecount_opt(_callPropertyCount) const WS_CALL_PROPERTY* _callProperties,
__in const ULONG _callPropertyCount,
__in_opt const WS_ASYNC_CONTEXT* _asyncContext,
__in_opt WS_ERROR* _error);
Você pode copiar os protótipos e usá-los como modelos para codificar as chamadas de função em seu cliente, em cada caso passando o identificador para o proxy de serviço. Quando terminar de usar o proxy de serviço, chame WsCloseServiceProxy.