Creazione di un client
La creazione di un client per i servizi Web è notevolmente semplificata in WWSAPI dall'API del modello di servizio e dallo strumento diWsUtil.exe . Il modello di servizio fornisce un'API che consente al client di inviare e ricevere messaggi su un canale come chiamate al metodo C. Lo strumento WsUtil genera intestazioni e helper per l'implementazione del client. Queste intestazioni includono i tipi e i prototipi di funzione per le funzioni C che rappresentano i servizi offerti dal servizio Web di destinazione. Gli helper vengono usati per creare il proxy del servizio, che contiene le informazioni di associazione e l'indirizzo dell'endpoint per il servizio.
Uso di WsUtil per generare intestazioni e helper
Per generare le intestazioni e gli helper, WsUtil apre e legge i file di metadati per il servizio di destinazione, ovvero file wsdl e xsd, e li converte in intestazioni; pertanto, è necessario recuperare i file di metadati per il servizio di destinazione in anticipo, ad esempio usando SvcUtil, una parte di Windows Communication Foundation. Per motivi di sicurezza, è fondamentale che le copie di questi file siano attendibili. Per altre informazioni, vedere la sezione "Sicurezza" dell'argomento WsUtil Compiler Tool .
Per eseguire WsUtil, usare la sintassi della riga di comando seguente se i file WSDL e XSD per il servizio si trovano nella propria directory: . WsUtil.exe *.wsdl *.xsd
In alternativa, è possibile specificare i file in base al nome completo.
WsUtil genera in genere due file per ogni file di metadati: un'intestazione e un file C. Aggiungere questi file al progetto di codifica e usare #include istruzioni per includerli nel codice per il client. I file XSD rappresentano tipi e i file WSDL rappresentano operazioni.
Creazione del proxy del servizio
L'intestazione generata da WsUtil contiene una routine helper per la creazione del proxy del servizio con l'associazione necessaria. Questa routine è inclusa nella sezione "Routine helper policy" del file di intestazione generato. Ad esempio, l'intestazione generata per il servizio calcolatrice illustrata nell'esempio httpcalculatorclientexample conterrà il prototipo di funzione seguente.
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);
Incorporare questo helper nel codice e passare un handle WS_SERVICE_PROXY per ricevere l'handle al proxy del servizio creato. Nello scenario più semplice, in cui alla funzione vengono passati solo un handle proxy del servizio e un oggetto errore, la chiamata sarà simile alla seguente.
hr = BasicHttpBinding_ICalculator_CreateServiceProxy(
NULL,
NULL,
0,
&serviceProxy,
error);
Per creare la parte dell'indirizzo del proxy del servizio, chiamare WsOpenServiceProxy con un handle al proxy del servizio e un puntatore a un WS_ENDPOINT_ADDRESS contenente l'indirizzo dell'endpoint del servizio a cui si vuole connettersi.
Implementazione del client con prototipi di funzione
Le intestazioni generate dai file WSDL del servizio contengono anche prototipi di funzioni C che rappresentano i servizi disponibili dal servizio Web e specifici dell'associazione richiesta. Ad esempio, un'intestazione generata per il servizio calcolatrice illustrata in HttpCalculatorServiceExample conterrà il prototipo seguente per l'operazione di moltiplicazione del servizio.
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);
È possibile copiare i prototipi e usarli come modelli per codificare le chiamate di funzione nel client, in ogni caso passando l'handle al proxy del servizio. Al termine del proxy del servizio, chiamare WsCloseServiceProxy.