Configuration de liaisons pour les services Windows Communication Foundation
Lorsque vous créez une application, vous souhaitez souvent confier des décisions à l'administrateur après le déploiement de l'application. Par exemple, il n'existe souvent aucune façon de savoir à l'avance ce que sera une adresse de service ou un URI (Uniform Resource Identifier). Au lieu de d'encoder de manière irréversible une adresse, il est préférable de permettre à un administrateur de le faire après avoir créé un service. Cette souplesse est obtenue par le biais de la configuration.
Notes
Utilisez l’outil ServiceModel Metadata Utility Tool (Svcutil.exe) avec le commutateur /config
pour créer rapidement des fichiers de configuration.
Sections principales
Le schéma de configuration Windows Communication Foundation (WCF) inclut les trois sections principales suivantes (serviceModel
, bindings
et services
) :
<configuration>
<system.serviceModel>
<bindings>
</bindings>
<services>
</services>
<behaviors>
</behaviors>
</system.serviceModel>
</configuration>
Éléments ServiceModel
Vous pouvez utiliser la section délimitée par l’élément system.ServiceModel
pour configurer un type de service avec un ou plusieurs points de terminaison, ainsi que les paramètres pour un service. Ensuite, chaque point de terminaison peut être configuré avec une adresse, un contrat et une liaison. Pour plus d’informations sur les points de terminaison, consultez Vue d’ensemble de la création de point de terminaison. Si aucun point de terminaison n'est spécifié, le runtime ajoute des points de terminaison par défaut. Pour plus d’informations sur les points de terminaison, les liaisons et les comportements par défaut, consultez Configuration simplifiée et Configuration simplifiée pour les services WCF.
Une liaison spécifie des transports (HTTP, TCP, canaux, Message Queuing ) et des protocoles (sécurité, fiabilité, flux de transaction) et se compose d’éléments de liaison, dont chacun spécifie un aspect de la manière dont un point de terminaison communique avec le monde.
Par exemple, la spécification de l’élément <basicHttpBinding> indique qu’il convient d’utiliser HTTP comme transport pour un point de terminaison. Cela permet de rattacher le point de terminaison au moment de l'exécution lorsque le service qui utilise ce point de terminaison est ouvert.
Il existe deux types de liaisons : les liaisons prédéfinies et les liaisons personnalisées. Les liaisons prédéfinies contiennent des combinaisons utiles d’éléments utilisés dans des scénarios courants. Pour obtenir la liste des types de liaisons prédéfinies fournis par WCF, consultez Liaisons fournies par le système. Si aucune collection de liaison prédéfinie n’a la combinaison correcte de fonctionnalités dont une application de service a besoin, vous pouvez construire des liaisons personnalisées pour satisfaire les exigences de l’application. Pour plus d’informations sur les liaisons personnalisées, consultez <customBinding>.
Les quatre exemples ci-dessous illustrent les configurations de liaison les plus courantes utilisées pour configurer un service WCF.
Spécification d’un point de terminaison pour utiliser un type de liaison
Le premier exemple montre comment spécifier un point de terminaison configuré avec une adresse, un contrat et une liaison.
<service name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
<!-- This section is optional with the default configuration introduced
in .NET Framework 4. -->
<endpoint
address="/HelloWorld2/"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding" />
</service>
Dans cet exemple, l'attribut name
indique à quel type de service la configuration est destinée. Lorsque vous créez un service dans votre code avec le contrat HelloWorld
, il est initialisé avec tous les points de terminaison définis dans l'exemple de configuration. Si l’assembly implémente un seul contrat de service, l’attribut name
peut être omis parce que le service utilise le seul type disponible. L'attribut utilise une chaîne, qui doit être dans le format Namespace.Class, AssemblyName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
L'attribut address
spécifie l'URI que d'autres points de terminaison utilisent pour communiquer avec le service. L’URI peut être un chemin d’accès absolu ou relatif. Si une adresse relative est fournie, l’hôte est censé fournir une adresse de base appropriée au schéma de transport utilisé dans la liaison. Si une adresse n'est pas configurée, l'adresse de base est l'adresse pour ce point de terminaison.
L'attribut contract
spécifie le contrat que ce point de terminaison expose. Le type d'implémentation de service doit implémenter le type de contrat. Si une implémentation de service implémente un seul type de contrat, cette propriété peut alors être omise.
L’attribut de binding
sélectionne une liaison prédéfinie ou personnalisée à utiliser pour ce point de terminaison spécifique. Un point de terminaison qui ne sélectionne pas explicitement de liaison utilise la sélection de liaison par défaut, qui correspond à BasicHttpBinding
.
Modification d'une liaison prédéfinie
Dans l'exemple suivant, une liaison prédéfinie est modifiée. Elle peut alors être utilisée pour configurer tout point de terminaison dans le service. La liaison est modifiée en affectant 1 seconde à la valeur ReceiveTimeout. Notez que la propriété retourne un objet TimeSpan.
Cette liaison modifiée se trouve dans la section consacrée aux liaisons. Cette liaison modifiée peut maintenant être utilisée lors de la création de tout point de terminaison en définissant l'attribut binding
dans l'élément endpoint
.
Notes
Si vous donnez un nom particulier à la liaison, le bindingConfiguration
spécifié dans le point de terminaison du service doit lui correspondre.
<service name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
<endpoint
address="/HelloWorld2/"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding" />
</service>
<bindings>
<basicHttpBinding
receiveTimeout="00:00:01"
/>
</bindings>
Configuration d'un comportement à appliquer à un service
Dans l'exemple ci-dessous, un comportement spécifique est configuré pour le type de service. L’élément ServiceMetadataBehavior
est utilisé pour permettre à l’outil ServiceModel Metadata Utility Tool (Svcutil.exe) d’interroger le service et de générer des documents WSDL (Web Services Description Language) à partir des métadonnées.
Notes
Si vous donnez un nom particulier au comportement, le behaviorConfiguration
spécifié dans la section du point de terminaison ou du service doit lui correspondre.
<behaviors>
<behavior>
<ServiceMetadata httpGetEnabled="true" />
</behavior>
</behaviors>
<services>
<service
name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
<endpoint
address="http://computer:8080/Hello"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding" />
</service>
</services>
La configuration précédente permet à un client d'appeler et d'obtenir les métadonnées du service typé « HelloWorld ».
svcutil /config:Client.exe.config http://computer:8080/Hello?wsdl
Spécification d’un service avec deux points de terminaison qui utilisent des valeurs de liaison différentes
Dans ce dernier exemple, deux points de terminaison sont configurés pour le type de service HelloWorld
. Chaque point de terminaison utilise un attribut bindingConfiguration
personnalisé différent du même type de liaison (chacun modifie basicHttpBinding
).
<service name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
<endpoint
address="http://computer:8080/Hello1"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding"
bindingConfiguration="shortTimeout" />
<endpoint
address="http://computer:8080/Hello2"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding"
bindingConfiguration="Secure" />
</service>
<bindings>
<basicHttpBinding
name="shortTimeout"
timeout="00:00:00:01"
/>
<basicHttpBinding
name="Secure">
<Security mode="Transport" />
</basicHttpBinding>
</bindings>
Vous pouvez obtenir le même comportement à l'aide de la configuration par défaut en ajoutant une section protocolMapping
et en configurant les liaisons comme illustré dans l'exemple suivant.
<protocolMapping>
<add scheme="http" binding="basicHttpBinding" bindingConfiguration="shortTimeout" />
<add scheme="https" binding="basicHttpBinding" bindingConfiguration="Secure" />
</protocolMapping>
<bindings>
<basicHttpBinding
name="shortTimeout"
timeout="00:00:00:01"
/>
<basicHttpBinding
name="Secure" />
<Security mode="Transport" />
</bindings>