Création d’un client
La création d’un client pour les services Web est considérablement simplifiée dans WWSAPI par l’API de modèle de service et l’outil WsUtil.exe . Le modèle de service fournit une API qui permet au client d’envoyer et de recevoir des messages sur un canal en tant qu’appels de méthode C. L’outil WsUtil génère des en-têtes et des assistances pour l’implémentation du client. Ces en-têtes incluent les types et prototypes de fonction pour les fonctions C représentant les services offerts par le service Web cible. Les assistances sont utilisées pour créer le proxy de service, qui contient les informations de liaison et l’adresse de point de terminaison pour le service.
Utilisation de WsUtil pour générer des en-têtes et des helpers
Pour générer les en-têtes et les helpers, WsUtil ouvre et lit les fichiers de métadonnées du service cible (fichiers wsdl et xsd) et les convertit en en-têtes ; Par conséquent, il est nécessaire de récupérer les fichiers de métadonnées du service cible à l’avance, par exemple en utilisant SvcUtil, une partie de Windows Communication Foundation. Pour des raisons de sécurité, il est impératif que vos copies de ces fichiers soient fiables. (Pour plus d’informations, consultez la section « Sécurité » de la rubrique Outil de compilateur WsUtil .)
Pour exécuter WsUtil, utilisez la syntaxe de ligne de commande suivante si les fichiers WSDL et XSD du service se trouvent dans leur propre répertoire : WsUtil.exe *.wsdl *.xsd
. Vous pouvez également spécifier les fichiers par nom complet.
WsUtil génère généralement deux fichiers pour chaque fichier de métadonnées : un en-tête et un fichier C. Ajoutez ces fichiers à votre projet de codage et utilisez #include instructions pour les inclure dans le code de votre client. (Les fichiers XSD représentent des types, et les fichiers WSDL représentent des opérations.)
Création du proxy de service
L’en-tête généré par WsUtil contient une routine d’assistance pour créer le proxy de service avec la liaison requise. Cette routine est incluse dans la section « Routines d’assistance de stratégie » du fichier d’en-tête généré. Par exemple, l’en-tête généré pour le service de calculatrice illustré dans l’exemple httpcalculatorclientexample contient le prototype de fonction suivant.
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);
Incorporez cette assistance dans votre code et passez un handle WS_SERVICE_PROXY pour recevoir le handle au proxy de service créé. Dans le scénario le plus simple, dans lequel seuls un handle de proxy de service et un objet d’erreur sont passés à la fonction, l’appel se présente comme suit.
hr = BasicHttpBinding_ICalculator_CreateServiceProxy(
NULL,
NULL,
0,
&serviceProxy,
error);
Pour créer la partie adresse du proxy de service, appelez WsOpenServiceProxy avec un handle vers le proxy de service et un pointeur vers un WS_ENDPOINT_ADDRESS contenant l’adresse de point de terminaison de service à laquelle vous souhaitez vous connecter.
Implémentation du client avec des prototypes de fonction
Les en-têtes générés à partir des fichiers WSDL du service contiennent également des prototypes de fonction C représentant les services disponibles à partir du service Web et spécifiques à la liaison requise. Par exemple, un en-tête généré pour le service de calculatrice illustré dans HttpCalculatorServiceExample contient le prototype suivant pour l’opération de multiplication de ce service.
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);
Vous pouvez copier les prototypes et les utiliser comme modèles pour coder les appels de fonction dans votre client, en transmettant dans chaque cas le handle au proxy de service. Lorsque vous avez terminé avec le proxy de service, appelez WsCloseServiceProxy.