Partager via


Vue d’ensemble de la création de point de terminaison

Toutes les communications avec un service Windows Communication Foundation (WCF) se produisent via les points de terminaison du service. Les points de terminaison fournissent aux clients l’accès aux fonctionnalités qu’offre un service WCF. Cette section décrit la structure d’un point de terminaison et explique comment définir un point de terminaison dans la configuration et dans le code.

Structure d’un point de terminaison

Chaque point de terminaison contient une adresse qui indique où trouver le point de terminaison, une liaison qui spécifie comment un client peut communiquer avec le point de terminaison et un contrat qui identifie les méthodes disponibles.

  • Adresse. L’adresse identifie de manière unique le point de terminaison et indique aux consommateurs potentiels où se trouve le service. Il est représenté dans le modèle objet WCF par l’adresse EndpointAddress , qui contient un URI (Uniform Resource Identifier) et des propriétés d’adresse qui incluent une identité, certains éléments WSDL (Web Services Description Language) et une collection d’en-têtes facultatifs. Les en-têtes facultatifs fournissent des informations d’adressage détaillées supplémentaires pour identifier ou interagir avec le point de terminaison. Pour plus d’informations, consultez Spécification d’une adresse de point de terminaison.

  • Liaison. La liaison spécifie comment communiquer avec le point de terminaison. La liaison spécifie la façon dont le point de terminaison communique avec le monde, y compris le protocole de transport à utiliser (par exemple, TCP ou HTTP), l’encodage à utiliser pour les messages (par exemple, texte ou binaire) et les exigences de sécurité nécessaires (par exemple, secure Sockets Layer [SSL] ou la sécurité des messages SOAP). Pour plus d’informations, consultez Utilisation de liaisons pour configurer les services et les clients.

  • Contrat de service. Le contrat de service décrit les fonctionnalités exposées par le point de terminaison au client. Un contrat spécifie les opérations qu’un client peut appeler, la forme du message et le type de paramètres d’entrée ou de données requis pour appeler l’opération, et le type de traitement ou de message de réponse attendu par le client. Trois types de contrats de base correspondent aux modèles d’échange de messages de base (MEPS) : datagramme (unidirectionnel), demande/réponse et duplex (bidirectionnel). Le contrat de service peut également utiliser des contrats de données et de messages pour exiger des types de données et des formats de message spécifiques lors de l’accès. Pour plus d’informations sur la définition d’un contrat de service, consultez Conception de contrats de service. Notez qu’un client peut également être tenu d’implémenter un contrat défini par le service, appelé contrat de rappel, pour recevoir des messages du service dans un meP duplex. Pour plus d’informations, consultez Duplex Services.

Le point de terminaison d’un service peut être spécifié de manière impérative à l’aide du code ou de manière déclarative par le biais de la configuration. Si aucun point de terminaison n’est spécifié, le runtime fournit des points de terminaison par défaut en ajoutant un point de terminaison par défaut pour chaque adresse de base pour chaque contrat de service implémenté par le service. La définition de points de terminaison dans le code n’est généralement pas pratique, car les liaisons et adresses d’un service déployé sont généralement différentes de celles utilisées pendant le développement du service. En règle générale, il est plus pratique de définir des points de terminaison de service à l’aide de la configuration plutôt que du code. La conservation des informations de liaison et d’adressage hors du code leur permet de changer sans avoir à recompiler et à redéployer l’application.

Remarque

Lors de l’ajout d’un point de terminaison de service qui effectue l’emprunt d’identité, vous devez utiliser l’une AddServiceEndpoint des méthodes ou la GetContract(Type, Type) méthode pour charger correctement le contrat dans un nouvel ServiceDescription objet.

Définition de points de terminaison dans le code

L’exemple suivant montre comment spécifier un point de terminaison dans le code avec les éléments suivants :

  • Définissez un contrat pour un IEcho type de service qui accepte le nom d’une personne et écho avec la réponse « Hello <name> ! ».

  • Implémentez un Echo service du type défini par le IEcho contrat.

  • Spécifiez une adresse de point de terminaison du http://localhost:8000/Echo service.

  • Configurez le service à l’aide Echo d’une WSHttpBinding liaison.

namespace Echo
{
   // Define the contract for the IEcho service
   [ServiceContract]
   public interface IEcho
   {
       [OperationContract]
       String Hello(string name)
   }

   // Create an Echo service that implements IEcho contract
   class Echo : IEcho
   {
      public string Hello(string name)
      {
         return "Hello" + name + "!";
      }
      public static void Main ()
      {
          //Specify the base address for Echo service.
          Uri echoUri = new Uri("http://localhost:8000/");

          //Create a ServiceHost for the Echo service.
          ServiceHost serviceHost = new ServiceHost(typeof(Echo),echoUri);

          // Use a predefined WSHttpBinding to configure the service.
          WSHttpBinding binding = new WSHttpBinding();

          // Add the endpoint for this service to the service host.
          serviceHost.AddServiceEndpoint(
             typeof(IEcho),
             binding,
             echoUri
           );

          // Open the service host to run it.
          serviceHost.Open();
     }
  }
}
' Define the contract for the IEcho service
    <ServiceContract()> _
    Public Interface IEcho
        <OperationContract()> _
        Function Hello(ByVal name As String) As String
    End Interface

' Create an Echo service that implements IEcho contract
    Public Class Echo
        Implements IEcho
        Public Function Hello(ByVal name As String) As String _
 Implements ICalculator.Hello
            Dim result As String = "Hello" + name + "!"
            Return result
        End Function

' Specify the base address for Echo service.
Dim echoUri As Uri = New Uri("http://localhost:8000/")

' Create a ServiceHost for the Echo service.
Dim svcHost As ServiceHost = New ServiceHost(GetType(HelloWorld), echoUri)

' Use a predefined WSHttpBinding to configure the service.
Dim binding As New WSHttpBinding()

' Add the endpoint for this service to the service host.
serviceHost.AddServiceEndpoint(GetType(IEcho), binding, echoUri)

' Open the service host to run it.
serviceHost.Open()

Remarque

L’hôte de service est créé avec une adresse de base, puis le reste de l’adresse, par rapport à l’adresse de base, est spécifié dans le cadre d’un point de terminaison. Ce partitionnement de l’adresse permet de définir plusieurs points de terminaison plus facilement pour les services sur un hôte.

Remarque

Les propriétés de ServiceDescription l’application de service ne doivent pas être modifiées après la OnOpening méthode sur ServiceHostBase. Certains membres, tels que la Credentials propriété et les AddServiceEndpoint méthodes sur ServiceHostBase et ServiceHost, lèvent une exception si elles ont été modifiées au-delà de ce point. D’autres vous permettent de les modifier, mais le résultat n’est pas défini.

De même, les valeurs ServiceEndpoint sur le client ne doivent pas être modifiées après l'appel à OnOpening sur le ChannelFactory. La Credentials propriété lève une exception si elle a été modifiée au-delà de ce point. Les autres valeurs de description du client peuvent être modifiées sans erreur, mais le résultat n’est pas défini.

Que ce soit pour le service ou le client, il est recommandé de modifier la description avant d’appeler Open.

Définition de points de terminaison dans la configuration

Lors de la création d’une application, vous souhaitez souvent différer les décisions à l’administrateur qui déploie l’application. Par exemple, il n’existe souvent aucun moyen de savoir à l’avance quelle adresse de service (UN URI) 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. Pour plus d’informations, consultez Configuration des services.

Remarque

Utilisez l’outil utilitaire de métadonnées ServiceModel (Svcutil.exe) avec le commutateur/config: du [,] pour créer rapidement des fichiers de configuration.

Utilisation de points de terminaison par défaut

Si aucun point de terminaison n’est spécifié dans le code ou dans la configuration, le runtime fournit des points de terminaison par défaut en ajoutant un point de terminaison par défaut pour chaque adresse de base pour chaque contrat de service implémenté par le service. L’adresse de base peut être spécifiée dans le code ou dans la configuration, et les points de terminaison par défaut sont ajoutés lorsqu’ils Open() sont appelés sur le ServiceHost. Cet exemple est le même exemple de la section précédente, mais, étant donné qu’aucun point de terminaison n’est spécifié, les points de terminaison par défaut sont ajoutés.

namespace Echo
{
   // Define the contract for the IEcho service
   [ServiceContract]
   public interface IEcho
   {
       [OperationContract]
       String Hello(string name)
   }

   // Create an Echo service that implements IEcho contract
   public class Echo : IEcho
   {
      public string Hello(string name)
      {
         return "Hello" + name + "!";
      }
      public static void Main ()
      {
          //Specify the base address for Echo service.
          Uri echoUri = new Uri("http://localhost:8000/");

          //Create a ServiceHost for the Echo service.
          ServiceHost serviceHost = new ServiceHost(typeof(Echo),echoUri);

          // Open the service host to run it. Default endpoints
          // are added when the service is opened.
          serviceHost.Open();
     }
  }
}
' Define the contract for the IEcho service
    <ServiceContract()> _
    Public Interface IEcho
        <OperationContract()> _
        Function Hello(ByVal name As String) As String
    End Interface

' Create an Echo service that implements IEcho contract
    Public Class Echo
        Implements IEcho
        Public Function Hello(ByVal name As String) As String _
 Implements ICalculator.Hello
            Dim result As String = "Hello" + name + "!"
            Return result
        End Function

' Specify the base address for Echo service.
Dim echoUri As Uri = New Uri("http://localhost:8000/")

' Open the service host to run it. Default endpoints
' are added when the service is opened.
serviceHost.Open()

Si les points de terminaison sont explicitement fournis, les points de terminaison par défaut peuvent toujours être ajoutés en appelant AddDefaultEndpoints le ServiceHost serveur avant d’appeler Open. Pour plus d’informations sur les points de terminaison par défaut, consultez Configuration simplifiée et Configuration simplifiée pour les services WCF.

Voir aussi