Compartir a través de


Extremos estándar

Los puntos de conexión se definen mediante la especificación de una dirección, un enlace y un contrato. Otros parámetros que se pueden establecer en un extremo incluyen la configuración del comportamiento, los encabezados y los URI de escucha. Para ciertos tipos de puntos de conexión, estos valores no cambian. Por ejemplo, los extremos de intercambio de metadatos siempre utilizan el contrato IMetadataExchange. Otros extremos, como WebHttpEndpoint, siempre requieren un comportamiento de extremo especificado. La utilidad de un punto de conexión se puede mejorar teniendo puntos de conexión con valores predeterminado para las propiedades de punto de conexión utilizadas normalmente. Los extremos estándar permiten a un desarrollador definir un extremo que tenga los valores predeterminados o en el que una o más propiedades del extremo no cambien. Estos puntos de conexión le permiten utilizar un punto de conexión de este tipo sin tener que especificar información de tipo estático. Los puntos de conexión estándar se pueden usar para puntos de conexión de la aplicación y de la infraestructura.

Extremos de infraestructura

Un servicio puede exponer extremos con algunas de las propiedades no implementadas de forma explícita por el autor del servicio. Por ejemplo, el punto de conexión del intercambio de metadatos expone el contrato IMetadataExchange pero, como autor del servicio, no implementa esa interfaz, pues la implementa WCF. Estos extremos de infraestructura tienen valores predeterminados para una o más propiedades de extremo, algunos de los cuales pueden ser inalterables. La propiedad Contract del extremo del intercambio de metadatos debe ser IMetadataExchange, mientras que el desarrollador puede proporcionar otras propiedades, como el enlace. Los puntos de conexión de la infraestructura se identifican estableciendo la propiedad IsSystemEndpoint en true.

Extremos de la aplicación

Los desarrolladores de la aplicación pueden definir sus propios puntos de conexión estándar que especifican los valores predeterminados para la dirección, el enlace o el contrato. Defina un extremo estándar derivando una clase de ServiceEndpoint y estableciendo las propiedades de extremo adecuadas. Puede proporcionar valores predeterminados a propiedades que se pueden cambiar. Otras propiedades tendrán valores estáticos que no podrán cambiar. En el siguiente ejemplo, se muestra cómo implementar un punto de conexión estándar.

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 utilizar un punto de conexión personalizado definido por el usuario en un archivo de configuración, debe derivar una clase de StandardEndpointElement, derivar una clase de StandardEndpointCollectionElement<TStandardEndpoint,TEndpointConfiguration> y registrar el nuevo punto de conexión estándar en la sección de extensiones de app.config o machine.config. StandardEndpointElement proporciona el soporte técnico de configuración para el punto de conexión estándar, tal y como se muestra en el ejemplo siguiente.

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> proporciona el tipo de respaldo para la colección que aparece en la sección <standardEndpoints> de la configuración correspondiente al punto de conexión estándar. En el siguiente ejemplo, se muestra cómo implementar esta clase.

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

En el siguiente ejemplo, se muestra cómo registrar un punto de conexión estándar en la sección de extensiones.

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

Configurar un punto de conexión estándar

Los puntos de conexión estándar se pueden agregar en código o en configuración. Para agregar un punto de conexión estándar en código, basta con crear instancias del tipo de punto de conexión estándar adecuado y agregarlo al host del servicio, tal y como se muestra en el siguiente ejemplo:

serviceHost.AddServiceEndpoint(new CustomEndpoint());

Para agregar un punto de conexión estándar a la configuración, agregue un elemento <endpoint> al elemento <service> y cualquier valor de configuración necesario en el elemento <standardEndpoints>. En el ejemplo siguiente, se muestra cómo agregar UdpDiscoveryEndpoint, uno de los puntos de conexión estándar que se distribuye con .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>

El tipo de punto de conexión estándar se especifica mediante el atributo de clase en el elemento <endpoint>. El punto de conexión se configura dentro del elemento <standardEndpoints>. En el ejemplo anterior, se agrega y se configura un punto de conexión de UdpDiscoveryEndpoint. El elemento <udpDiscoveryEndpoint> contiene un objeto <standardEndpoint> que establece la propiedad MulticastAddress de UdpDiscoveryEndpoint.

puntos de conexión estándar distribuidos con .NET Framework

En la tabla siguiente, se muestra una lista de los puntos de conexión estándar distribuidos con .NET Framework 4.6.1.

Mex Endpoint Un punto de conexión estándar que se usa para exponer metadatos del servicio.

AnnouncementEndpoint Un extremo estándar que usan los servicios para enviar mensajes del anuncio.

DiscoveryEndpoint Un punto de conexión estándar que usan los servicios para enviar mensajes de la detección.

UdpDiscoveryEndpointUn punto de conexión estándar que se pre-configura para las operaciones de detección en un enlace de multidifusión de UDP.

UdpAnnouncementEndpointUn punto de conexión estándar que usan los servicios para enviar mensajes de anuncio en un enlace de UDP.

DynamicEndpoint Un punto de conexión estándar que usa WS-Discovery para encontrar la dirección del punto de conexión de forma dinámica en tiempo de ejecución.

ServiceMetadataEndpoint Un punto de conexión estándar para el intercambio de metadatos.

WebHttpEndpoint Un punto de conexión estándar con un enlace WebHttpBinding que agrega automáticamente el comportamiento WebHttpBehavior.

WebScriptEndpoint Un punto de conexión estándar con un enlace WebHttpBinding que agrega automáticamente el comportamiento WebScriptEnablingBehavior.

WebServiceEndpoint Un extremo estándar con un enlace WebHttpBinding.

WorkflowControlEndpoint Un extremo estándar que le permite llamar a las operaciones de control en instancias de flujo de trabajo.

WorkflowHostingEndpoint Un punto de conexión estándar que admite la creación de flujo de trabajo y la reanudación del marcador.