Condividi tramite


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 di WsUtil.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 strumenti di supporto 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 collegamento e l'indirizzo dell'endpoint per il servizio.

Utilizzo 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 in anticipo i file di metadati per il servizio di destinazione, ad esempio usando SvcUtil, una parte di Windows Communication Foundation. Per motivi di sicurezza, è fondamentale che le copie di questi file siano attendibili. Per ulteriori informazioni, vedere la sezione "Sicurezza" dell'argomento dello strumento del compilatore WsUtil .

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. Aggiungi questi file al tuo progetto di codifica e usa le direttive #include per includerli nel codice del tuo cliente. I file XSD rappresentano tipi e i file WSDL rappresentano le operazioni.

Creazione del proxy del servizio

L'intestazione generata da WsUtil contiene una routine di supporto per la creazione del proxy del servizio con il binding richiesto. Questa routine è inclusa nella sezione "Routine di supporto per le politiche" 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 del servizio proxy creato. Nello scenario più semplice, in cui solo un handle proxy del servizio e un oggetto errore vengono passati alla funzione, la chiamata è 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 per il proxy del servizio e un puntatore a un WS_ENDPOINT_ADDRESS contenente l'indirizzo dell'endpoint di servizio a cui connettersi.

Implementazione del client con prototipi di funzione

Le intestazioni generate dai file WSDL del servizio contengono anche prototipi di funzione 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 di servizio. Quando hai finito con il proxy di servizio, chiamare WsCloseServiceProxy.