Partage via


Configuration de liaisons pour les services Windows Communication Foundation

Lors de la création d’une application, vous souhaitez souvent différer les décisions à l’administrateur après le déploiement de l’application. Par exemple, il n’existe souvent aucun moyen de savoir à l’avance quelle adresse de service ou l’URI (Uniform Resource Identifier) sera. Au lieu de coder en dur une adresse, il est préférable d’autoriser un administrateur à le faire après avoir créé un service. Cette flexibilité s’effectue par le biais de la configuration.

Remarque

Utilisez l’outil Utilitaire de métadonnées ServiceModel (Svcutil.exe) avec le /config commutateur pour créer rapidement des fichiers de configuration.

Sections principales

Le schéma de configuration Windows Communication Foundation (WCF) comprend les trois sections principales suivantes (serviceModelet bindingsservices) :

<configuration>
    <system.serviceModel>
        <bindings>
        </bindings>
        <services>
        </services>
        <behaviors>
        </behaviors>
    </system.serviceModel>
</configuration>

Éléments ServiceModel

Vous pouvez utiliser la section limitée par l’élément system.ServiceModel pour configurer un type de service avec un ou plusieurs points de terminaison, ainsi que des 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 les transports (HTTP, TCP, canaux, Message Queuing) et les protocoles (sécurité, fiabilité, flux de transactions) et se compose d’éléments de liaison, chacun d’entre eux spécifiant un aspect de la façon dont un point de terminaison communique avec le monde.

Par exemple, la spécification de l’élément <basicHttpBinding> indique d’utiliser HTTP comme transport pour un point de terminaison. Il est utilisé pour connecter le point de terminaison au moment de l’exécution lorsque le service utilisant ce point de terminaison est ouvert.

Il existe deux types de liaisons : prédéfinies et 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 liaison prédéfinis que WCF fournit, consultez System-Provided Liaisons. Si aucune collection de liaisons prédéfinie n’a la combinaison correcte des fonctionnalités dont une application de service a besoin, vous pouvez construire des liaisons personnalisées pour répondre aux exigences de l’application. Pour plus d’informations sur les liaisons personnalisées, consultez <customBinding>.

Les quatre exemples suivants illustrent les configurations de liaison les plus courantes utilisées pour configurer un service WCF.

Spécifier 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 le type de service pour lequel la configuration est activée. Lorsque vous créez un service dans votre code avec le HelloWorld contrat, 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, car le service utilise le seul type disponible. L’attribut prend une chaîne, qui doit être au format Namespace.Class, AssemblyName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null

L’attribut address spécifie l’URI que les autres points de terminaison utilisent pour communiquer avec le service. L’URI peut être un chemin absolu ou relatif. Si une adresse relative est fournie, l’hôte doit fournir une adresse de base appropriée pour le schéma de transport utilisé dans la liaison. Si une adresse n’est pas configurée, l’adresse de base est supposée être l’adresse de 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 type de contrat unique, cette propriété peut être omise.

L’attribut 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 une liaison utilise la sélection de liaison par défaut, c’est-à-dire BasicHttpBinding.

Modification d’une liaison prédéfinie

Dans l’exemple suivant, une liaison prédéfinie est modifiée. Il peut ensuite être utilisé pour configurer n’importe quel point de terminaison dans le service. La liaison est modifiée en réglant la valeur de ReceiveTimeout à 1 seconde. Notez que la propriété retourne un TimeSpan objet.

Cette liaison modifiée se trouve dans la section consacrée aux liaisons. Cette liaison modifiée peut désormais être utilisée lors de la création d’un point de terminaison en définissant l’attribut binding dans l’élément endpoint .

Remarque

Si vous attribuez un nom particulier à la liaison, le bindingConfiguration point de terminaison de service spécifié doit correspondre à celui-ci.

<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 suivant, un comportement spécifique est configuré pour le type de service. L’élément ServiceMetadataBehavior est utilisé pour activer l’outil Utilitaire de métadonnées ServiceModel (Svcutil.exe) pour interroger le service et générer des documents WSDL (Web Services Description Language) à partir des métadonnées.

Remarque

Si vous attribuez un nom particulier au comportement, la section de service ou de point de terminaison spécifiée dans behaviorConfiguration doit correspondre à celui-ci.

<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 à l’aide de valeurs de liaison différentes

Dans ce dernier exemple, deux points de terminaison sont configurés pour le type de HelloWorld service. Chaque point de terminaison utilise un attribut personnalisé bindingConfiguration différent du même type de liaison (chacun modifie le 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 protocolMapping section 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>

Voir aussi