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<TStandardEndpoint,TEndpointConfiguration> et inscrire le nouveau point de terminaison standard dans la section extensions dans app.config ou machine.config. 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)
    {
    }
}

StandardEndpointCollectionElement<TStandardEndpoint,TEndpointConfiguration> 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"/>
      </standardEndpointExtensions>
</extensions>

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.6.1.

<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 du UdpDiscoveryEndpoint.

Points de terminaison standard fournis avec le .NET Framework

Le tableau suivant liste les points de terminaison standard fournis avec .NET Framework 4.6.1.

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.

UdpDiscoveryEndpointPoint de terminaison standard préconfiguré pour les opérations de découverte sur une liaison de multidiffusion UDP.

UdpAnnouncementEndpointPoint 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.

ServiceMetadataEndpoint Point de terminaison standard pour l'échange de métadonnées.

WebHttpEndpoint Point de terminaison standard avec une liaison WebHttpBinding qui ajoute automatiquement le comportement WebHttpBehavior

WebScriptEndpoint Point de terminaison standard avec une liaison WebHttpBinding qui ajoute automatiquement le comportement WebScriptEnablingBehavior.

WebServiceEndpoint Point de terminaison standard avec une liaison WebHttpBinding.

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.