Endpoint standard

Gli endpoint vengono definiti specificando un indirizzo, un'associazione e un contratto. Altri parametri che è possibile impostare su un endpoint includono la configurazione di comportamento, le intestazioni e gli URI di ascolto. Per determinati tipi di endpoint tali valori non cambiano. Gli endpoint di scambio dei metadati utilizzano ad esempio sempre il contratto IMetadataExchange. Altri endpoint, quali WebHttpEndpoint, richiedono sempre un comportamento di endpoint specificato. L'usabilità di un endpoint può essere migliorata grazie a endpoint con valori predefiniti per le proprietà di endpoint di uso comune. Gli endpoint standard consentono a uno sviluppatore di definire un endpoint che dispone di valori predefiniti o in cui una o più proprietà di endpoint non cambiano. Questi endpoint consentono di utilizzare tale endpoint senza dovere specificare informazioni di natura statica. Gli endpoint standard possono essere utilizzati per endpoint infrastruttura ed endpoint applicazione.

Endpoint infrastruttura

Un servizio può esporre endpoint con alcune proprietà non implementate in modo esplicito dall'autore del servizio. L'endpoint di scambio dei metadati espone ad esempio il contratto IMetadataExchange, ma l'autore del servizio non implementa l'interfaccia, poiché viene implementata da WCF. Tali endpoint infrastruttura dispongono di valori predefiniti per una o più proprietà di endpoint, alcune delle quali potrebbero non essere modificabili. La proprietà Contract dell'endpoint di scambio dei metadati deve essere IMetadataExchange, mentre altre proprietà, tra cui l'associazione, possono essere fornite dallo sviluppatore. Gli endpoint infrastruttura vengono identificati impostando la proprietà IsSystemEndpoint su true.

Endpoint applicazione

Gli sviluppatori di applicazioni possono definire endpoint standard specifici che indicano valori predefiniti per l'indirizzo, l'associazione o il contratto. Un endpoint standard viene definito deducendo una classe da ServiceEndpoint e impostando le proprietà di endpoint appropriate. È possibile fornire valori predefiniti per proprietà che possono essere modificate. Altre proprietà disporranno di valori statici che non sarà possibile modificare. Nell'esempio riportato di seguito viene illustrato come implementare un endpoint 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; }
}

Per utilizzare un endpoint personalizzato definito dall'utente in un file di configurazione, è necessario dedurre una classe da StandardEndpointElement, dedurre una classe da StandardEndpointCollectionElement<TStandardEndpoint,TEndpointConfiguration> e registrare il nuovo endpoint standard nella sezione delle estensioni in app.config o machine.config. StandardEndpointElement fornisce supporto ala configurazione per l'endpoint standard, come indicato nell'esempio seguente.

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> fornisce il tipo di supporto per la raccolta visualizzata nella sezione <standardEndpoints> all'interno della configurazione per l'endpoint standard. Nell'esempio seguente viene illustrato come implementare la classe.

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

Nell'esempio seguente viene mostrato come registrare un endpoint standard nella sezione delle estensioni.

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

Configurazione di un endpoint standard

È possibile aggiungere endpoint standard al codice o alla configurazione. Per aggiungere un endpoint standard al codice, è sufficiente creare un'istanza del tipo di endpoint standard appropriato e aggiungerla all'host del servizio, come indicato nell'esempio seguente:

serviceHost.AddServiceEndpoint(new CustomEndpoint());  

Per aggiungere un endpoint standard nella configurazione, aggiungere un elemento <endpoint> all'elemento <service> ed eventuali impostazioni di configurazione necessarie nell'elemento <standardEndpoints>. Nell'esempio seguente viene mostrato come aggiungere UdpDiscoveryEndpoint, uno degli endpoint standard disponibili in .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>

Il tipo di endpoint standard viene specificato mediante l'attributo kind nell'elemento <endpoint>. L'endpoint viene configurato all'interno dell'elemento <standardEndpoints>. Nell'esempio precedente viene aggiunto e configurato un endpoint UdpDiscoveryEndpoint. L'elemento <udpDiscoveryEndpoint> contiene un oggetto <standardEndpoint> che imposta la proprietà MulticastAddress dell'oggetto UdpDiscoveryEndpoint.

Endpoint standard forniti con .NET Framework

Nella tabella seguente sono elencati gli endpoint standard forniti con .NET Framework 4.61.

Mex Endpoint
Endpoint standard utilizzato per esporre metadati del servizio.

AnnouncementEndpoint
Endpoint standard utilizzato dai servizi per inviare messaggi di annuncio.

DiscoveryEndpoint
Endpoint standard utilizzato dai servizi per inviare messaggi di individuazione.

UdpDiscoveryEndpoint
Endpoint standard preconfigurato per le operazioni di individuazione su un'associazione multicast UDP.

UdpAnnouncementEndpoint
Endpoint standard utilizzato dai servizi per inviare messaggi di annuncio su un'associazione UDP.

DynamicEndpoint
Endpoint standard che utilizza WS-Discovery per cercare l'indirizzo endpoint in modo dinamico al runtime.

ServiceMetadataEndpoint
Endpoint standard per lo scambio dei metadati.

WebHttpEndpoint
Endpoint standard con un'associazione WebHttpBinding che aggiunge in modo automatico il comportamento WebHttpBehavior.

WebScriptEndpoint
Endpoint standard con un'associazione WebHttpBinding che aggiunge in modo automatico il comportamento WebScriptEnablingBehavior.

WebServiceEndpoint
Endpoint standard con un'associazione WebHttpBinding.

WorkflowControlEndpoint
Un endpoint standard che consente di chiamare operazioni di controllo sulle istanze del flusso di lavoro.

WorkflowHostingEndpoint
Endpoint standard che supporta la creazione del flusso di lavoro e la ripresa dei segnalibri.