Compartilhar via


Pontos de extremidade padrão

Os pontos de extremidade são definidos especificando um endereço, uma associação e um contrato. Outros parâmetros que podem ser definidos em um ponto de extremidade incluem configuração de comportamento, cabeçalhos e URIs de escuta. Para determinados tipos de pontos de extremidade, esses valores não mudam. Por exemplo, os pontos de extremidade de troca de metadados sempre usam o contrato IMetadataExchange. Outros pontos de extremidade, como WebHttpEndpoint sempre, exigem um comportamento de ponto de extremidade especificado. A usabilidade de um ponto de extremidade pode ser melhorada tendo pontos de extremidade com valores padrão para propriedades de ponto de extremidade comumente usadas. Os pontos de extremidade padrão permitem que um desenvolvedor defina um ponto de extremidade que tenha valores padrão ou onde uma ou mais propriedades do ponto de extremidade não sejam alteradas. Esses pontos de extremidade permitem que você use esse ponto de extremidade sem precisar especificar informações de uma natureza estática. Os pontos de extremidade padrão podem ser usados para pontos de extremidade de infraestrutura e aplicativo.

Pontos de extremidade de infraestrutura

Um serviço pode expor pontos de extremidade com algumas das propriedades não implementadas explicitamente pelo autor do serviço. Por exemplo, o ponto de extremidade de troca de metadados expõe o contrato IMetadataExchange, mas, como um autor de serviço, você não implementa essa interface, ela é implementada pelo WCF. Esses pontos de extremidade de infraestrutura têm valores padrão para uma ou mais propriedades de ponto de extremidade, algumas das quais podem ser inalteráveis. A propriedade Contract do ponto de extremidade de troca de metadados deve ser IMetadataExchange, enquanto outras propriedades como associação podem ser fornecidas pelo desenvolvedor. Os pontos de extremidade da infraestrutura são identificados definindo a propriedade IsSystemEndpoint como true.

Pontos de extremidade do aplicativo

Os desenvolvedores de aplicativos podem definir seus próprios pontos de extremidade padrão que especificam valores padrão para o endereço, a associação ou o contrato. Você define um ponto de extremidade padrão derivando uma classe de ServiceEndpoint e definindo as propriedades do ponto de extremidade apropriadas. Você pode fornecer valores padrão para propriedades que podem ser alteradas. Algumas outras propriedades terão valores estáticos que não podem ser alterados. O exemplo a seguir mostra como implementar um ponto de extremidade padrão.

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; }
}

Para usar um ponto de extremidade personalizado definido pelo usuário em um arquivo de configuração que você deve derivar uma classe de StandardEndpointElement, derivar uma classe de StandardEndpointCollectionElement<TStandardEndpoint,TEndpointConfiguration> e registrar o novo ponto de extremidade padrão na seção de extensões em app.config ou machine.config. O StandardEndpointElement fornece suporte de configuração para o ponto de extremidade padrão, conforme mostrado no exemplo a seguir.

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)
    {
    }
}

O StandardEndpointCollectionElement<TStandardEndpoint,TEndpointConfiguration> fornece o tipo de suporte para a coleção que aparece na seção <standardEndpoints> na configuração do ponto de extremidade padrão. O exemplo a seguir mostra como implementar essa classe.

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

O exemplo a seguir mostra como registrar um ponto de extremidade padrão na seção de extensões.

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

Configurando um ponto de extremidade padrão

Os pontos de extremidade padrão podem ser adicionados no código ou na configuração. Para adicionar um ponto de extremidade padrão no código, basta instanciar o tipo de ponto de extremidade padrão apropriado e adicioná-lo ao host de serviço, conforme mostrado no exemplo a seguir:

serviceHost.AddServiceEndpoint(new CustomEndpoint());

Para adicionar um ponto de extremidade padrão na configuração, adicione um elemento <endpoint> ao elemento <service> e quaisquer definições de configuração necessárias no elemento <standardEndpoints>. O exemplo a seguir mostra como adicionar um UdpDiscoveryEndpoint, um dos pontos de extremidade padrão que é fornecido com o .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>

O tipo de ponto de extremidade padrão é especificado usando o atributo de tipo no elemento <endpoint>. O ponto de extremidade está configurado dentro do elemento <standardEndpoints>. No exemplo acima, um ponto de extremidade UdpDiscoveryEndpoint é adicionado e configurado. O elemento <udpDiscoveryEndpoint> contém um <standardEndpoint> que define a propriedade MulticastAddress do UdpDiscoveryEndpoint.

Pontos de extremidade padrão enviados com o .NET Framework

A tabela a seguir lista os pontos de extremidade padrão enviados com o .NET Framework 4.6.1.

Mex Endpoint Um ponto de extremidade padrão usado para expor metadados de serviço.

AnnouncementEndpoint Um ponto de extremidade padrão usado pelos serviços para enviar mensagens de comunicado.

DiscoveryEndpoint Um ponto de extremidade padrão usado pelos serviços para enviar mensagens de descoberta.

UdpDiscoveryEndpointUm ponto de extremidade padrão pré-configurado para operações de descoberta por meio de uma associação multicast UDP.

UdpAnnouncementEndpointUm ponto de extremidade padrão usado pelos serviços para enviar mensagens de comunicado por meio de uma associação UDP.

DynamicEndpoint Um ponto de extremidade padrão que usa o WS-Discovery para localizar o endereço do ponto de extremidade dinamicamente em tempo de execução.

ServiceMetadataEndpoint Um ponto de extremidade padrão para troca de metadados.

WebHttpEndpoint Um ponto de extremidade padrão com uma associação WebHttpBinding que adiciona o comportamento WebHttpBehavior automaticamente

WebScriptEndpoint Um ponto de extremidade padrão com uma associação WebHttpBinding que adiciona o comportamento WebScriptEnablingBehavior automaticamente.

WebServiceEndpoint Um ponto de extremidade padrão com uma associação WebHttpBinding.

WorkflowControlEndpoint Um ponto de extremidade padrão que permite chamar operações de controle em instâncias de fluxo de trabalho.

WorkflowHostingEndpoint Um ponto de extremidade padrão que dá suporte à criação de fluxo de trabalho e à retomada do indicador.