Création manuelle d’un proxy de service pour un service WCF
Le moyen le plus simple de créer un proxy de service client pour un service Windows Communication Foundation (WCF) consiste à utiliser la couche Modèle de service avec l’outil WsUtil, comme décrit dans la rubrique Création d’un client . Toutefois, si nécessaire, vous pouvez également créer un proxy de service manuellement. Cette API inclut une fonction WsCreateServiceProxy pour créer le proxy de service, ainsi que des structures, des énumérations, etc. pour définir les propriétés nécessaires à l’interopérabilité avec WCF.
WCF fournit un certain nombre de liaisons standard, chacune ciblant un scénario d’utilisation spécifique. La liaison à laquelle le service auquel vous essayez de vous connecter utilise, à son tour, détermine les propriétés de canal que vous devez personnaliser pour que votre proxy de service communique avec le service.
WSHttpBinding est destiné au scénario de services web Internet principaux. Il utilise la version SOAP 1.2 et WS-Addressing version 1.0 plus récente et permet un large éventail de paramètres de sécurité sur les transports HTTP et HTTPS publics. WWSAPI n’a pas d’équivalent de WSHttpBinding (ou de l’une des liaisons standard WCF, d’ailleurs), mais étant donné que sa version SOAP par défaut, WS-Addressing version et le format d’encodage correspondent à ceux de WSHttpBinding, la création d’un proxy de service pour un service qui utilise WSHttpBinding est simple. Par exemple, pour créer un proxy de service pour communiquer avec un point de terminaison WSHttpBinding sans sécurité, vous pouvez simplement utiliser du code comme l’extrait de code suivant (la déclaration de variable et la création de tas et d’erreur sont omises). Notez qu’aucune propriété de canal ou description de sécurité n’est spécifiée dans l’appel à la fonction WsCreateServiceProxy .
// Create the proxy
hr = WsCreateServiceProxy(
WS_CHANNEL_TYPE_REQUEST,
WS_HTTP_CHANNEL_BINDING,
NULL, // security description
NULL, // proxy properties
0, // proxy property count
NULL, // channel properties
0, // channel property count
&proxy,
error);
La fonction crée le proxy de service et retourne un pointeur vers celui-ci dans le paramètre serviceProxy (&proxy dans l’appel de fonction ci-dessus).
Toutefois, lorsque vous créez manuellement un proxy de service pour un service WCF qui utilise une liaison BasicHttpBinding, il est nécessaire de définir la version SOAP et WS-Addressing propriétés du canal. Cela est dû au fait que WWSAPI utilise par défaut SOAP version 1.2 et WS-Addressing 1.0. BasicHttpBinding de WCF, en revanche, utilise SOAP version 1.1 et aucun adressage WS.
Pour définir la version SOAP et les propriétés WS-Addrssing du canal, déclarez un tableau de structures WS_CHANNEL_PROPERTY pour contenir les propriétés du canal et les informations associées.
WS_CHANNEL_PROPERTY channelProperties[4]; // Array to hold up to 4 channel properties
ULONG channelPropertyCount = 0; // Count of properties set
WS_ENVELOPE_VERSION soapVersion = WS_ENVELOPE_VERSION_SOAP_1_1; // Set required SOAP version
channelProperties[channelPropertyCount].id = WS_CHANNEL_PROPERTY_ENVELOPE_VERSION; // Type of first channel property
channelProperties[channelPropertyCount].value = &soapVersion; // Address of the SOAP version value
channelProperties[channelPropertyCount].valueSize = sizeof(soapVersion); // Size of the value
channelPropertyCount++; // Increment property count
WS_ADDRESSING_VERSION addressingVersion = WS_ADDRESSING_VERSION_TRANSPORT; // Set required WS-Addressing value
channelProperties[channelPropertyCount].id = WS_CHANNEL_PROPERTY_ADDRESSING_VERSION; // Type of second channel property
channelProperties[channelPropertyCount].value = &addressingVersion ; // Address of the WS-Addressing value
channelProperties[channelPropertyCount].valueSize = sizeof(addressingVersion ); // Size of the value
channelPropertyCount++; // Increment property count
// add more channel properties here
Transmettez ensuite le tableau des propriétés de canal (channelProperties) et le nombre de propriétés (channelPropertyCount) à WsCreateServiceProxy (ou WsCreateChannel si vous travaillez sur la couche de canal).
// Create the proxy
hr = WsCreateServiceProxy(
WS_CHANNEL_TYPE_REQUEST,
WS_HTTP_CHANNEL_BINDING,
NULL, // security description
NULL, // proxy properties
0, // proxy property count
channelProperties, // channel properties
channelPropertyCount, // channel property count
&proxy,
error);
Le tableau que vous avez déclaré contenir les propriétés est copié dans WsCreateServiceProxy et, par conséquent, vous pouvez libérer la mémoire du tableau de propriétés immédiatement après l’appel de la fonction. En outre, si vous allouez la mémoire à partir de la pile (comme l’extrait de code ci-dessus), vous pouvez également retourner à partir de la fonction immédiatement après l’appel.
En outre, WWSAPI fournit des mécanismes permettant de créer des proxys de service pour communiquer avec les services WCF à l’aide d’autres liaisons, telles que NetTcpBinding et WSFederationHttpBinding. La plupart de ces liaisons nécessitent la définition de propriétés de canal supplémentaires, telles que les descripteurs de sécurité. Pour obtenir des exemples illustrant l’utilisation d’autres liaisons, consultez la section Exemples des services Web Windows, en particulier les sous-sections Exemples de couche de canal TCP, Exemples de couche de canal HTTP et Exemples de couche de canal de sécurité .