Partager via


Points de terminaison standard

Les points de terminaison sont définis en spécifiant une adresse, une liaison et un contrat. Les autres paramètres qui peuvent être définis sur un point de terminaison incluent la configuration du comportement, les en-têtes, et les URI d'écoute. Pour certains types de points de terminaison, ces valeurs ne changent pas. Par exemple, les points de terminaison d'échange de métadonnées utilisent toujours le contrat IMetadataExchange. D'autres points de terminaison, tels que WebHttpEndpoint, requièrent toujours un comportement de point de terminaison spécifié. L'utilisation d'un point de terminaison peut être simplifiée par l'emploi de points de terminaison possédant des valeurs par défaut pour des propriétés de point de terminaison courantes. Les points de terminaison standard permettent à un développeur de définir un point de terminaison avec des valeurs par défaut ou dont une ou plusieurs propriétés de point de terminaison restent inchangées. Les points de terminaison de ce type vous permettent d'utiliser un point de terminaison sans avoir à spécifier les informations qui sont de nature statique. Les points de terminaison standard peuvent être utilisés comme points de terminaison d'infrastructure et d'application.

Points de terminaison d'infrastructure

Un service peut exposer des points de terminaison dont certaines des propriétés n'ont pas été implémentées de manière explicite par l'auteur du service. Par exemple, le point de terminaison d'échange de métadonnées expose le contrat IMetadataExchange, mais vous n'implémentez pas cette interface en tant qu'auteur du service, elle est implémentée par WCF. Ces points de terminaison d'infrastructure ont des valeurs par défaut pour une ou plusieurs propriétés de point de terminaison, dont certaines peuvent être immuables. La propriété Contract du point de terminaison d'échange de métadonnées doit être IMetadataExchange, tandis que d'autres propriétés comme la liaison peuvent être fournies par le développeur. Les points de terminaison d'infrastructure sont identifiés en attribuant à la propriété IsSystemEndpoint la valeur true.

Points de terminaison d'application

Les développeurs d'applications peuvent définir leurs propres points de terminaison standard qui spécifient des valeurs par défaut pour l'adresse, la liaison ou le contrat. Vous définissez un point de terminaison standard en dérivant une classe de ServiceEndpoint et en définissant les propriétés de point de terminaison appropriées. Vous pouvez fournir des valeurs par défaut pour les propriétés qui peuvent être modifiées. D'autres propriétés ont des valeurs statiques qui ne peuvent pas être modifiées. L'exemple suivant indique comment implémenter un point de terminaison standard.

public class CustomEndpoint : ServiceEndpoint
    {
        public CustomEndpoint()
            : this(string.Empty)
        {
        }

        public CustomEndpoint(string address)
            : this(address, ContractDescription.GetContract(typeof(ICalculator)))
        {
        }

        // Create the custom endpoint with a fixed binding
        public CustomEndpoint(string address, ContractDescription contract)
            : base(contract)
        {
            this.Binding = new BasicHttpBinding();
            this.IsSystemEndpoint = false;
        }

        // Definition of the additional property of this endpoint
        public bool Property
        {
            get;
            set;
        }
    }

Pour utiliser un point de terminaison personnalisé défini par l'utilisateur dans un fichier de configuration, vous devez dériver une classe de StandardEndpointElement, dériver une classe de StandardEndpointCollectionElement et enregistrer le nouveau point de terminaison standard dans la section des extensions, dans app.config ou machine.config. L'élément StandardEndpointElement fournit une prise en charge de la configuration pour le point de terminaison standard, comme indiqué dans l'exemple suivant.

public class CustomEndpointElement : StandardEndpointElement
    {
        // Definition of the additional property for the standard endpoint element
        public bool Property
        {
            get { return (bool)base["property"]; }
            set { base["property"] = value; }
        }

        // The additional property needs to be added to the properties of the standard endpoint element
        protected override ConfigurationPropertyCollection Properties
        {
            get
            {
                ConfigurationPropertyCollection properties = base.Properties;
                properties.Add(new ConfigurationProperty("property", typeof(bool), false, ConfigurationPropertyOptions.None));
                return properties;
            }
        }

        // Return the type of this standard endpoint
        protected override Type EndpointType
        {
            get { return typeof(CustomEndpoint); }
        }

        // Create the custom service endpoint
        protected override ServiceEndpoint CreateServiceEndpoint(ContractDescription contract)
        {
            return new CustomEndpoint();
        }

        // Read the value given to the property in config and save it
        protected override void OnApplyConfiguration(ServiceEndpoint endpoint, ServiceEndpointElement serviceEndpointElement)
        {
            CustomEndpoint customEndpoint = (CustomEndpoint)endpoint;
            customEndpoint.Property = this.Property;
        }

        // Read the value given to the property in config and save it
        protected override void OnApplyConfiguration(ServiceEndpoint endpoint, ChannelEndpointElement channelEndpointElement)
        {
            CustomEndpoint customEndpoint = (CustomEndpoint)endpoint;
            customEndpoint.Property = this.Property;
        }

        // No validation in this sample
        protected override void OnInitializeAndValidate(ServiceEndpointElement serviceEndpointElement)
        {
        }

        // No validation in this sample
        protected override void OnInitializeAndValidate(ChannelEndpointElement channelEndpointElement)
        {
        }
    }

L'élément StandardEndpointCollectionElement fournit le type de stockage pour la collection qui s'affiche sous la section <standardEndpoints> dans la configuration du point de terminaison standard. L'exemple suivant montre comment implémenter cette classe.

public class CustomEndpointCollectionElement : StandardEndpointCollectionElement<CustomEndpoint, CustomEndpointElement>
    {
         // ...

    }

L'exemple suivant montre comment enregistrer un point de terminaison standard dans la section des extensions.

<extensions>
      <standardEndpointExtensions>
        <add
          name="customStandardEndpoint"
          type="CustomEndpointCollectionElement, Example.dll,
                Version=1.0.0.0, Culture=neutral, PublicKeyToken=ffffffffffffffff"/>

Configuration d'un point de terminaison standard

Les points de terminaison standard peuvent être ajoutés dans le code ou dans la configuration. Pour ajouter un point de terminaison standard dans le code, il suffit d'instancier le type de point de terminaison standard approprié et de l'ajouter à l'hôte de service, comme indiqué dans l'exemple suivant :

serviceHost.AddServiceEndpoint(new CustomEndpoint());

Pour ajouter un point de terminaison standard dans la configuration, ajoutez un élément <endpoint> à l'élément <service> et tous les paramètres de configuration nécessaires dans l'élément <standardEndpoints>. L'exemple suivant montre comment ajouter un UdpDiscoveryEndpoint, l'un des points de terminaison standard fournis avec .NET Framework 4.

<services>
  <service>
    <endpoint isSystemEndpoint=”true” kind=”udpDiscoveryEndpoint” />
  </service>
</services>
<standardEndpoints>  
  <udpDiscoveryEndpoint>
     <standardEndpoint multicastAddress="soap.udp://239.255.255.250:3702" /> 
  </udpDiscoveryEndpoint>
</ standardEndpoints >

Le type de point de terminaison standard est spécifié à l'aide de l'attribut kind dans l'élément <endpoint>. Le point de terminaison est configuré dans l'élément <standardEndpoints>. Dans l'exemple ci-dessus, un point de terminaison UdpDiscoveryEndpoint est ajouté et configuré. L'élément <udpDiscoveryEndpoint> contient un <standardEndpoint> qui définit la propriété MulticastAddress de l'objet UdpDiscoveryEndpoint.

Points de terminaison standard fournis avec le .NET Framework

Le tableau suivant répertorie les points de terminaison standard fournis avec le .NET Framework 4.

  • Mex Endpoint
    Point de terminaison standard utilisé pour exposer des métadonnées de service.
  • AnnouncementEndpoint
    Point de terminaison standard utilisé par les services pour envoyer des messages d'annonce.
  • DiscoveryEndpoint
    Point de terminaison standard utilisé par les services pour envoyer des messages de découverte.
  • UdpDiscoveryEndpoint
    Point de terminaison standard préconfiguré pour les opérations de découverte sur une liaison de multidiffusion UDP.
  • UdpAnnouncementEndpoint
    Point de terminaison standard utilisé par les services pour envoyer des messages d'annonce sur une liaison UDP.
  • DynamicEndpoint
    Point de terminaison standard qui utilise WS-Discovery pour rechercher l'adresse du point de terminaison dynamiquement au moment de l'exécution.
  • WorkflowControlEndpoint
    Point de terminaison standard qui vous permet d'appeler des opérations de contrôle sur les instances de workflow.
  • WorkflowHostingEndpoint
    Point de terminaison standard qui prend en charge la création de workflow et la reprise de signet.